假设我有以下内容:
class Widget1{
public int TypeID { get; set; }
public string Color { get; set; }
}
class Widget2
{
public int TypeID { get; set; }
public string Brand { get; set; }
}
private void test()
{
List<Widget1> widgets1 = new List<Widget1>();
List<Widget2> widgets2 = new List<Widget2>();
List<Widget1> widgets1_in_widgets2 = new List<Widget1>();
//some code here to populate widgets1 and widgets2
foreach (Widget1 w1 in widgets1)
{
foreach (Widget2 w2 in widgets2)
{
if (w1.TypeID == w2.TypeID)
{
widgets1_in_widgets2.Add(w1);
}
}
}
}
我使用了两个foreach循环来比较TypeID的列表,以填充第三个列表。是否有其他方法可以使用LINQ通过TypeID比较这两个列表?可能使用Interstect或其他函数?
6条答案
按热度按时间vq8itlhq1#
你能做到的
tnkciper2#
你需要的是
Join
。Intersect
或多或少可以被看作是Join
的一种特殊情况,在这种情况下,两个序列是相同类型的,因此可以应用于相等,而不需要对每种类型进行投影来生成要比较的键。如果某个ID在第二个集合中重复,而您不希望该条目在结果中重复,则可以使用
GroupJoin
代替Join
:rmbxnbpk3#
我喜欢这个解决方案,因为它很容易阅读代码。
请参见fiddle中的完整示例:Fiddle example comparation
yqkkidmi4#
Join的缺点是,如果widgets1或widgets2包含多个具有相同TypeID的元素(顺便说一下,这也适用于原始代码),则结果可能会重复。
以下内容将完全满足您的需要:返回widgets1中的所有元素,widgets2中存在具有相应TypeID的元素。
daolsyd05#
尝试使用“Where”重载
wgeznvg76#
您总是可以使用Linq自己的
.Except()
method来为您进行比较,并返回“异常”或您所期望的相反结果。在这里,我将一个数组
errList
与另一个数组hList
进行“相交”,并返回其逆或hList
数组中不存在的行。结果