0

我在使用以下方法时遇到问题,该方法采用一长串字符串 ( big) 并通过包含另一个列表 ( small) 的最后几个字符的另一个列表对其进行过滤。

var big = new List<string> {
    "0000", "1111", "2222", "3333", "3333", "4444", "5555"
};

var small = new List<string> {
    "11", "22", "33", "33", "44"
};

var result = from b in big
from s in small
where b.EndsWith(s)
select b;

预期的结果是

"1111", "2222", "3333", "3333", "4444"

我得到的结果是

"1111", "2222", "3333", "3333", "3333", "3333", "4444"

我可以看到它为什么会发生,但我想不出如何阻止它。有任何想法吗?

4

2 回答 2

4

这个查询产生一个笛卡尔积,这就是你得到重复的原因。这有效:

var result = big.Where(b => small.Any(s => b.EndsWith(s)));

或使用半查询语法:

var result = from b in big
             where small.Any(s => b.EndsWith(s))
             select b;
于 2013-10-09T14:16:24.093 回答
1

你没有解释你想要什么,所以我假设你想big为每个单词显示第一个匹配项small。你可以这样做:

var result=from s in small
           let res=big.FirstOrDefault(s=>b.EndsWith(s))
           where res!=null
           select res;

如果要返回最后一个匹配项,请将 FirstOrDefault 替换为 LastOrDefault。

如果您想以其他方式选择匹配项,则必须解释您想要实现的目标

于 2013-10-09T14:19:12.387 回答