我在使用以下方法时遇到问题,该方法使用一长串字符串(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"
我可以看到它为什么会发生,但我想不出如何阻止它的方法。有什么想法吗?
答案 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。
如果你想以其他方式选择比赛,你必须解释你想要达到的目标