根据特定项目值从2个列表中获取项目

时间:2016-06-29 07:56:51

标签: c#

我有2个myType列表,让myType具有属性 x y和z;

class myType 
{
  public int x {get;set;}
  public int y {get;set;}
  public int? z {get;set;}
} 

List<myType> list1 = new List<myType>();
List<myType> list2 = new List<myType>();

我想要做的是获取2个列表之间匹配项目的列表 其中list1[i].x == list2[i].x && list1[i].y == list2[i].y 无论z

的值如何

这是我的代码

     List<MiHHUserComponent> components ;
     List<MiHHUserComponent> dbComponents;

我需要在2个列表之间匹配的项目 components[i].HHComponentFormName == dbComponents[i].HHComponentFormName && components[i].HHComponentName== dbComponents[i].HHComponentName

我尝试了以下代码

 for (int j = 0; j < hhUsersIDs.Count; j++)
     {
        var hhUser = hhUsersIDs[j]; 

        var results = (from l1 in dbComponents
                       join l2 in components
                       on new { l1.HHUserID, l1.HHComponentFormName,l1.HHComponentName } 
                       equals new {hhUser.HHUserID  ,l2.HHComponentFormName,l2.HHComponentName }
                       select new
                       {
                          // select whatever you want here, eg:
                          HHUserID = hhUser.HHUserID,
                          HHComponentFormName = l1.HHComponentFormName,
                          HHComponentName = l1.HHComponentName
                       }).ToList(); 
     }

我有2个不同要素数量的清单
他们有匹配的项目
我需要新的列表包含它们之间的匹配项目,基于两个列表中的特定项目 因为价值,新列表中会有重复的元素 z将取自另一个列表中的不同值 我希望现在明白了

3 个答案:

答案 0 :(得分:2)

您可以使用简单的linq扩展方法实现此目的。

var rresult = list1.Where(x=>  list2.Any(l=>l.x ==x.x && l.y ==x.y));

答案 1 :(得分:1)

使用linq加入:

请务必添加:using System.Linq;

var results = (from l1 in list1
                join l2 in list2
                on new { l1.x, l1.y } equals new { l2.x, l2.y }
                select new myType()
                {
                    // select whatever you want here, eg:
                    X = l1.x,
                    Y = l1.y,
                    Z = default(int) // or whatever the type of z is
                }).ToList();

编辑:

var results = (from l1 in dbComponents
                join l2 in components
                on new { l1.HHComponentFormName, l1.HHComponentName }
                equals new { l2.HHComponentFormName, l2.HHComponentName }
                where l1.HHUserID == hhUser.HHUserID
                select new myType()
                {
                    // select whatever you want here, eg:
                    HHUserID = hhUser.HHUserID,
                    HHComponentFormName = l1.HHComponentFormName,
                    HHComponentName = l1.HHComponentName
                }).ToList();

答案 2 :(得分:0)

var lookup1 = list1.ToLookup(t => new { t.x, t.y });
var lookup2 = list2.ToLookup(t => new { t.x, t.y });
var keys = lookup1.Where(t => lookup2.Contains(t.Key)).Select(t => t.Key);
return keys.SelectMany(t => lookup1[t].Concat(lookup2[t]));