2015-05-04 130 views
0

所以我有两个使用linq的列表。将两个列表数据合并为单个列表C#

List<One> one= A.Common 
       .Join(B.Common, 
       a => a.ID, 
       b=> b.ID, 
       (a, b) => new One 
       { 
        ID = b.PID, 
        Name = b.PCName, 
        LastName = a.LName 
       }).ToList(); 

List<One> two = (from c in D.Options 
       select new One 
       { 
        MainName = c.mName 
       }).ToList(); 

List<One> sn = one.Concat(two).ToList(); 

我将这两个列表拼接在一起。但是,当我调试我得到MainName为sn list为空。

如何从单个列表中的两个列表中获取数据?

+0

您是否检查过在'two'中MainName获得的值?你的代码对我来说看起来很好。 –

+0

第一个集合,你没有设置MainName ...可以吗? – dmyoko

+0

@MairajAhmad我有一个类 – Richa

回答

3

这是你如何做到这一点:

var sn = one.Zip(two, (x, y) => new One{ 
    ID = x.ID, 
    Name = x.Name, 
    LastName = x.LastName, 
    MainName = y.MainName 
}); 
+0

我得到了问题,但不知道如何使用LINQ来解决它:) – Shaharyar

+0

这是减少原始项目的计数 – Richa

+0

我然而,重要的是要确保这两个列表的组织得当......这些元素是有序的,并且没有人缺失(除非你想丢弃缺失的元素)。 – dmyoko

0

您希望为所有列表值分配的MainName属性在列表ONE

从上面码级联将加入两个列表和MainName将未设置为列表中的一个元素。

one.Concat(two) 

上面的代码只会将两个列表连接到一个列表元素。

0

您可以使用LINQ ConcatToList方法:

var mergedList = YourFirstList.Concat(YourSecondList) 
        .Concat(YourThirdList) 
        .ToList(); 

编辑:

one.Concat(two).Select(g => g.Aggregate((p1,p2) => new One 
{ 
    ID = p1.ID, 
    Name = p1.PCName, 
    LastName = p1.LName, 
    MainName = p2.mName 
})); 

更有效的方式来做到这一点 - 上面将基本循环所有条目,创建动态大小的缓冲区河

var mergedList = new List<One>(YourFirstList.Count + 
           YourSecondList.Count + 
           YourThirdList.Count); 
mergedList.AddRange(YourFirstList); 
mergedList.AddRange(YourSecondList); 
mergedList.AddRange(YourThirdList); 

的AddRange是special-casedICollection<T>效率。

可以使用Zip方法。

one.Zip(two,(o1, o2) => new One() 
{ 
    ID = o1.ID, 
    Name = o1.PCName, 
    LastName = o1.LName, 
    MainName = o2.mName 
});