的LINQ:找到具有共同属性的元素,但不同类型的
我有两个列表使用对象:的LINQ:找到具有共同属性的元素,但不同类型的
class Class1
{
public int Id { get; set; }
public string Name { get; set; }
public Guid UniqueIdentifier { get; set; }
public bool IsValid { get; set; }
}
class Class2
{
public int Identifier { get; set; }
public string Producer{ get; set; }
public Guid Guid { get; set; }
public int SupplierId { get; set; }
}
有没有办法使用linq
获得Class1
类型从列表中具有相同的Id
元素(一种方式标识符)和Guid
与第二个列表中的Class2
类型的元素?
下面是做到这一点的一种方法:
var result = list1
.Where(x => list2.Any(y => x.Id == y.Identifier && x.UniqueIdentifier == y.Guid))
.ToList();
请注意,此版本不支持大型列表优化。如果你的名单很小,这很好。如果您的列表很大,则需要一个涉及诸如HashSet
之类的解决方案。这里有一个例子:
var list2HashSet = CreateHashset(list2.Select(x => new {x.Identifier, x.Guid}));
var result = list1
.Where(x => list2HashSet.Contains(new {Identifier = x.Id, Guid = x.UniqueIdentifier}))
.ToList();
凡CreateHashset
的定义是这样的:
public static HashSet<T> CreateHashset<T>(IEnumerable<T> collection)
{
return new HashSet<T>(collection);
}
我要创建这个简单的方法,因为编译器抱怨说,它无法解析正确的构造函数重载。我不确定为什么。
我的列表将有大约500 k个元素,所以你会建议使用hashset? –
@BudaGavril,我用一个例子更新了答案。 –
你可以尝试这样的事:
var result = from item1 in list1
join item2 in list2 on
new { G = item1.UniqueIdentifier, Id = item1.Id }
equals new { G = item2.Guid, Id = item2.Identifier }
select new { item1, item2 };
foreach(var item in result)
{
Console.WriteLine($"Producer: {item.item2.Producer} with product: {item.item1.Name}");
}
比方说,你有两个列表
List<Class1> List1;
List<Class2> List2;
您可以选择与
List1.Where(C1 => List2.Any(C2 => C1.Id == C2.Identifier && C1.UniqueIdentifier == C2.Guid));
注意Guid
是一类含有第二列表的编号和GUID列表1的所有项目。如果你不想检查,如果C1.UniqueIdentifier
和C2.Guid
是完全一样的对象,你应该implement IsEqual和使用它像
List1.Where(C1 => List2.Any(C2 => C1.Id == C2.Identifier && C1.UniqueIdentifier.Equals(C2.Guid)));
如果足以满足您的ID或的GUID的比赛,看到的Jeroen答案范兰根。否则,我看到两个选项:
-
添加
where
条款之后,即VAR的结果=从物品1在列表1 加入ITEM2在item1.Id列表2等于item2.Identifier 其中物品1。 UniqueIdentifier = item2.Guid select new {item1,item2};
创建一个元组类并加入Guid和Id的元组。您不能重用.NET 4元组类型(
Tuple<,>
),但您可以重复使用C#7元组类型,因为它们正确地实现了相等性。
这两个版本都应该也适用于大型列表。基本上,只要你使用join
就可以扩展整个事物。
你的意思是从列表1中获得所有具有来自列表2的对应元素的元素? –