列出A :3,5,5,5,7,9
列表B :3,5
两个列表都是相同的类型,这些值来自字段ID
。我的目标是构建一个将返回7,9
的forloop,因为列表B 中不存在7,9
。
我尝试过以下但没有运气:
int counter = 0;
foreach(var item in ListA.Where(x=>ListB.Any(b=>x.ID != b.ID)))
{
counter++;
//Here I should perform operation with item that having ID 7 and 9
}
更新
在上述情况下使用except
方法,counter
仍会返回4
,因为 ListA 中的每个5
都是不同的对象eventhou他们共享相同的ID。我的最终目标是让counter
为2
,无论对象是否相同。只要 ListA 中的ID
对象为3
或5
,我就会将其排除。
答案 0 :(得分:4)
只需使用Except
扩展方法
foreach (var item in ListA.Except(ListB)) {
...
}
答案 1 :(得分:2)
它应该是“ALL”或“Not Any”
foreach(var item in ListA.Where(x=>ListB.All(b=>x.ID != b.ID)))
{
//Here I should perform operation with item that having ID 7 and 9
}
更新
由于你实际上希望得到除A以外的A的不同结果,所以你可以这样做:
foreach(var item in ListA.GroupBy(m=>m.ID).Where(x=>ListB.All(b=>b.ID != x.Key)))
{
counter ++;
Debug.writeline(item.Key);
}
或
foreach(var id in ListA.Select(x=>x.ID).Distinct().Except(ListB.Select(y=>y.ID)))
{
counter++;
}
注意:所有未经测试的 - 我暂时没有编译器。
答案 2 :(得分:2)
更改您的查询:
foreach(var item in ListA.Where(x=> !ListB.Any(b => x.ID == b.ID)))
它应该可以正常工作。
答案 3 :(得分:1)
试试这个:
List<int> listA=new List<int>(new[]{ 3,5,7,9});
List<int> listB=new List<int>(new[]{ 3,5});
var items=(from a in listA
select a).Except(from b in listB
select b);
foreach(var item in items)
{
Console.WriteLine(ll);
}
输出
7
9
答案 4 :(得分:1)
当两个List属于同一类型时,可以使用方法。 如果类型不同。我们可以这样使用。
var outPut = _employees.Where(i =&gt; _employeeExtensions.Any(j =&gt; i.EmpId == j.EmpId));
答案 5 :(得分:0)
我认为您希望将列表中的项目ID
设置为不同:
我在LinqPad中放在一起的例子:
void Main()
{
List<Person> a = new List<Person>()
{
new Person { ID = 1 },
new Person { ID = 2 },
new Person { ID = 3 },
};
List<Person> b = new List<Person>()
{
new Person { ID = 1 },
};
var c = a.Where(x => b.Any(bprime => bprime.ID != x.ID));
foreach(var item in c)
{
Console.WriteLine(item.ID);
}
}
class Person
{
public int ID { get; set; }
}
输出:
2
3
这类似于Except
方法,但这将检查元素的属性。