合并linq中没有匿名类型的两个列表

时间:2014-02-18 12:42:19

标签: c# linq

我有:var list = IEnumerable<MergedData>其中

public class MergedData
{
   public A A;
   public B B;
}

public class A
{
   public int Id;
   public string Value;
}

public class B
{
   public int Id;
   public string Value;
}

我该怎么做才能最终得到一个合并类型的列表,其中A.Id, A.Value, B.Id, B.Value 没有创建匿名类型?

我希望合并程序独立于特定类型AB

3 个答案:

答案 0 :(得分:1)

即使我更喜欢@Yumei De Armas回答背后的想法。只需创建一个包含所需属性的新类,并创建此类的新实例。类似的东西:

public class MergedData
{
 public int AId;
 public string AValue;
 public int BId;
 public string BValue;
}

在您的LINQ中,您只需使用此类而不是匿名对象,例如:  ..new MergedData { AId = some_value, AValue = some_value, BId = some_value, BValue = some_value}

但是,您已经在MergedData课程中拥有这两个课程,所以如果您坚持自己的设计,那么您应该将语法复杂化一点:

..new MergedData { new A { Id = some_value, Value = some value}, new B { Id = some_value, Value = some value}}

答案 1 :(得分:0)

为什么不能使用匿名类型?

var result = list.Select(item => new {
                           AId = item.A.Id, 
                           AValue = item.A.Value, 
                           BId = item.B.Id, 
                           BValue= item.B.Value});

你到底需要什么?

例如,列表的值为A = {2,“2”},B = {3,“3”},A = {4,“4”},B = {5,“5”},什么是预期的结果?

注意:如果你想让两者都在同一个列表中,你可以做一些我想的事情......(我还没有测试过)

var result = list.Select(item => new {
                           Id = item.A.Id, 
                           Value = item.A.Value 
                         }).ToList().AddRange(list.Select(item => new {
                           Id = item.B.Id, 
                           Value = item.B.Value 
                         });

但是,您仍需要在不同的字段中包含Id和Value。您是否还希望将两个字段添加到同一列表中?

答案 2 :(得分:0)

我认为你需要更清楚地提出你的问题 - 特别是关于预期的产出。这是我的解释:

public class MergedData<T,T2>
{
   public T A;
   public T2 B;
   public MergedData(T A, T2 B)
   {
       this.A = A;
       this.B = B;   
   }
}

public class A
{
   public int Id;
   public string Value;
}

public class B
{
   public int Id;
   public string Value;
}

 var listOfMerged = new List<MergedData<A,B>>();
 for (int i=0; i<listOfA.Count; i++)
     listOfMerged.Add(new MergedData<A,B> (listOfA[i],listOfB[i]));

 //  Example of Use
 var merged = listOfMerged[0];
 Console.WriteLine(merged.A.Id);
 Console.WriteLine(merged.B.Value);

如果这与你想要的一致,我会看一下Tuple类型。