2016-11-10 70 views
1

我有两个列表使用对象:的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类型的元素?

+0

你的意思是从列表1中获得所有具有来自列表2的对应元素的元素? –

回答

1

下面是做到这一点的一种方法:

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); 
} 

我要创建这个简单的方法,因为编译器抱怨说,它无法解析正确的构造函数重载。我不确定为什么。

+0

我的列表将有大约500 k个元素,所以你会建议使用hashset? –

+0

@BudaGavril,我用一个例子更新了答案。 –

1

你可以尝试这样的事:

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}"); 
} 
0

比方说,你有两个列表

List<Class1> List1; 
List<Class2> List2; 

您可以选择与

List1.Where(C1 => List2.Any(C2 => C1.Id == C2.Identifier && C1.UniqueIdentifier == C2.Guid)); 

注意Guid是一类含有第二列表的编号和GUID列表1的所有项目。如果你不想检查,如果C1.UniqueIdentifierC2.Guid是完全一样的对象,你应该implement IsEqual和使用它像

List1.Where(C1 => List2.Any(C2 => C1.Id == C2.Identifier && C1.UniqueIdentifier.Equals(C2.Guid))); 
0

如果足以满足您的ID或的GUID的比赛,看到的Jeroen答案范兰根。否则,我看到两个选项:

  1. 添加where条款之后,即

    VAR的结果=从物品1在列表1 加入ITEM2在item1.Id列表2等于item2.Identifier 其中物品1。 UniqueIdentifier = item2.Guid select new {item1,item2};

  2. 创建一个元组类并加入Guid和Id的元组。您不能重用.NET 4元组类型(Tuple<,>),但您可以重复使用C#7元组类型,因为它们正确地实现了相等性。

这两个版本都应该也适用于大型列表。基本上,只要你使用join就可以扩展整个事物。

相关问题