选择许多重复的结果

时间:2013-10-09 14:12:23

标签: c# linq

我在使用以下方法时遇到问题,该方法使用一长串字符串(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"

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

您没有解释您想要的内容,因此我假设您要在big中为small中的每个单词显示第一个匹配项。你可以这样做:

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

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

如果你想以其他方式选择比赛,你必须解释你想要达到的目标