【发布时间】:2012-03-20 10:44:41
【问题描述】:
我有两个列表:
List<int> listA
List<int> listB
如何使用 LINQ 检查 listA 中是否存在 listB 中不存在的元素?我可以使用foreach 循环,但我想知道我是否可以使用 LINQ 来做到这一点
【问题讨论】:
我有两个列表:
List<int> listA
List<int> listB
如何使用 LINQ 检查 listA 中是否存在 listB 中不存在的元素?我可以使用foreach 循环,但我想知道我是否可以使用 LINQ 来做到这一点
【问题讨论】:
listA.Except(listB) 将为您提供 listA 中不在 listB 中的所有项目
【讨论】:
if (listA.Except(listB).Any())
【讨论】:
listA.Any(_ => listB.Contains(_))
:)
【讨论】:
listA.Except(listB).Any() == falselistA.Any(_ => listB.Contains(_)) == true
你可以在一行中完成
var res = listA.Where(n => !listB.Contains(n));
这不是最快的方法:如果listB比较长,这应该更快:
var setB = new HashSet(listB);
var res = listA.Where(n => !setB.Contains(n));
【讨论】:
List 有包含返回 bool 的方法。我们可以在查询中使用该方法。
List<int> listA = new List<int>();
List<int> listB = new List<int>();
listA.AddRange(new int[] { 1,2,3,4,5 });
listB.AddRange(new int[] { 3,5,6,7,8 });
var v = from x in listA
where !listB.Contains(x)
select x;
foreach (int i in v)
Console.WriteLine(i);
【讨论】:
使用Any() 获取两个列表的差异。如果满足条件,Linq Any() 函数会返回一个布尔值,但您可以使用它来返回两个列表的差异:
var difference = ListA.Where(a => !ListB.Any(b => b.ListItem == a.ListItem)).ToList();
【讨论】:
这段代码比较了两个列表,它们都包含一个 CultureCode 字段,例如“en-GB”。这将在列表中留下不存在的翻译。 (我们需要一个用于文章未翻译语言的下拉列表)
var compared = supportedLanguages.Where(sl => !existingTranslations.Any(fmt => fmt.CultureCode == sl.Culture)).ToList();
【讨论】: