gpt4 book ai didi

c# - 当排除列表为空时,从 Linq 查询中排除所有结果

转载 作者:太空宇宙 更新时间:2023-11-03 19:30:51 25 4
gpt4 key购买 nike

我有以下代码:

        public IList<Tweet> Match(IEnumerable<Tweet> tweetStream, IList<string> match, IList<string> exclude)
{
var tweets = from f in tweetStream
from m in match
where f.Text.ToLowerInvariant().Contains(m)
select f;

var final = from f in tweets
from e in exclude
where !f.Text.ToLowerInvariant().Contains(e.ToLowerInvariant())
select f;

return final.Distinct().ToList<Tweet>();
}

我一直在构建不包含 final 结果集的测试,现在匹配很愉快,如果 IList<string>exclude 为空,我添加了排除项,所有项目都被删除。

所以这个测试应该通过了:

        [TestMethod]
public void Should_exclude_items_from_exclude_list()
{
IEnumerable<Tweet> twitterStream = new List<Tweet>
{
new Tweet("I have a Mazda car"),
new Tweet("I have a ford"),
new Tweet("Mazda Rules"),
new Tweet("My Ford car is great"),
new Tweet("My renault is brill"),
new Tweet("Mazda cars are great")
};
IList<string> matches = new List<string>{"mazda","car"};
IList<string> exclude = new List<string>{"ford"};

Matcher target = new Matcher();
IList<Tweet> actual = target.Match(twitterStream, matches, exclude);

Assert.AreEqual(3, actual.Count);
}

但是这个测试现在失败了:

        [TestMethod]
public void Should_match_items_either_mazda_or_car_but_no_duplicates()
{
IEnumerable<Tweet> twitterStream = new List<Tweet>
{
new Tweet("I have a Mazda car"),
new Tweet("I have a ford"),
new Tweet("Mazda Rules"),
new Tweet("My Ford car is great"),
new Tweet("My renault is brill"),
new Tweet("Mazda cars are great")
};
IList<string> matches = new List<string>{"mazda","car"};
IList<string> exclude = new List<string>();

Matcher target = new Matcher();
IList<Tweet> actual = target.Match(twitterStream, matches, exclude);

Assert.AreEqual(4, actual.Count);
}

我知道我遗漏了一些非常简单的东西,但在盯着代码看了一个小时之后,我还是想不起来。

最佳答案

好吧,我知道它失败的原因:就是这个子句:

from e in exclude

这将是一个空集合,因此没有条目甚至可以命中 where 子句。

这是另一种方法:

var final = from f in tweets
let lower = f.Text.ToLowerInvariant()
where !exclude.Any(e => lower.Contains(e.ToLowerInvariant())
select f;

虽然我也考虑了 msarchet 的方法,但这个方法的好处是它最终只评估一次 tweetStream - 所以即使它从网络读取或做其他痛苦的事情,你也不会不用担心。在可能(和方便)的情况下,我尽量避免多次评估 LINQ 流。

当然,您可以非常轻松地使整个事情成为一个查询:

var tweets = from f in tweetStream
let lower = f.Text.ToLowerInvariant()
where match.Any(m => lower.Contains(m.ToLowerInvariant())
where !exclude.Any(e => lower.Contains(e.ToLowerInvariant())
select f;

老实说,我认为这样更干净:)

关于c# - 当排除列表为空时,从 Linq 查询中排除所有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5097910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com