我有两个对象列表。对于例如说对象就像下面的
class A
{
int ID;
int Value;
}
class B
{
int ID;
int Value;
}
我有两个上述对象列表,例如List<A> AList
和List<B> BList
。我想查找List<B>
中的任何对象是否具有与List<A>
匹配的值。
目前,我喜欢的是
foreach(var item in AList)
{
if(!BList.Any(x => x.Value == item.Value))
{
//Handle the error message
}
}
Linq有没有更好的方法呢?
答案 0 :(得分:1)
简单地:
from a in AList
join b in BList on a.Value equals b.Value
select a
答案 1 :(得分:1)
你可以这样做。如果BList中的任何项目在AList中具有匹配值,则会出现这种情况:
BList.Any(b => AList.Select(a => a.Value).Contains(b.Value))
答案 2 :(得分:1)
试试这个:
BList.Any(b => AList.Any(a => a.Value == b.Value));
答案 3 :(得分:1)
这是我尝试过的,似乎工作得很好:
class First
{
public int Id { get; set; }
public int Value { get; set; }
}
class Second
{
public int Id { get; set; }
public int Value { get; set; }
}
class Program
{
static void Main(string[] args)
{
var firstList = new List<First>
{
new First { Id = 1, Value = 2 },
new First { Id = 1, Value = 10 },
new First { Id = 1, Value = 0 }
};
var secondList = new List<Second>
{
new Second { Id = 1, Value = 2 },
new Second { Id = 1, Value = 2 },
new Second { Id = 1, Value = 4 }
};
bool hasCommonValues = firstList.Select(f => f)
.Any(u => secondList.Select(x => x.Value)
.Contains(u.Value));
Console.WriteLine(hasCommonValues);
}
}
答案 4 :(得分:1)
根据您当前的代码,如果AList
中的任何项目在BList
中没有匹配的项目时您只是需要处理错误,那么您可以这样做:
if (AList.Any(a => !BList.Any(b => b.Value == a.Value)))
{
//Handle error
}
或者,如果您需要对AList
中 BList
中没有匹配项的每个项目采取行动:
foreach(var item in AList.Where(a => !BList.Any(b => b.Value == a.Value)))
{
//Handle error for current `item`
}
无论如何,更喜欢LINQ而非传统foreach
循环的原因通常更多是因为它的可读性(更短,更清晰,更易于维护等)而非性能。供参考:Is a LINQ statement faster than a 'foreach' loop?