在C#List中如何选择所有列+多个自定义列,以便在每一行中所有列都是平的(不是嵌套的)?

时间:2017-06-01 19:03:57

标签: c# linq

我有一个简单的List,其中每一行都有 50列。我想要返回所有50列 + 3个自定义列但我想让列表的每一行都像一个扁平(非嵌套)对象。< / p>

示例:

var newList = list.Select(x => new 
    {  x,
       d.CustomColA = x.ColA+10,
       d.CustomColB = x.ColB+30,
       d.CustomColC = x.ColC+50
    });

结果:效果很好每个结果行都像一个嵌套对象:

var row = newList.FirstOrDefault();
row.x.ColA
row.x.ColB
row.x.ColC
.....
row.CustomColA 
row.CustomColB 
row.CustomColB 

预期结果:

var row = newList.FirstOrDefault();
row.ColA
row.ColB
row.ColC
.....
row.CustomColA 
row.CustomColB 
row.CustomColB 

我使用dynamic类型并编写了以下代码,但它没有返回预期的结果:

var newList = list.Select(x =>
{
   dynamic d = x;
   d.CustomColA = x.ColA+10;
   d.CustomColB = x.ColB+30;
   d.CustomColC = x.ColC+50;
   return d;
   //return x;
});

结果显示在监视面板中:'newList.FirstOrDefault()' threw an exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'

更新

  

注意:我在我的问题中写道,我有50个专栏并写了一篇   示例向您显示我不想要名称Select中的所有列!   (我知道我可以在Select中写出所有53列的名称!)所以这不是正确答案。

     

注意2:在真实的项目中我有复杂的自定义列,但我在这里写了一个非常简单的例子来展示我想要的东西。请写下您灵活的答案。谢谢。

3 个答案:

答案 0 :(得分:1)

所以你要做的是基本上映射一组属性。有这样的图书馆,Automapper是一个很好的。但是,您也可以使用继承类中的反射构造函数自己完成此操作。这看起来像这样:

假设:

  • 您的50列课程称为Cols
  • 您可以继承Cols


public class CustomColumns : Cols
{
    public int CustomColA { 
        get{
            return this.ColA + 10;
        }
    }
    public int CustomColB { 
        get{
            return this.ColB + 30;
        }
    }
    public int CustomColC { 
        get{
            return this.ColC + 50;
        }
    }
    public CustomColumns(Cols cols)
    {
        string[] localNames = this.GetType().GetMembers().Where(m => m.MemberType == MemberTypes.Property).Select(m => m.Name).ToArray();
        string[] ctorNames = cols.GetType().GetMembers().Where(m => m.MemberType == MemberTypes.Property).Select(m => m.Name).ToArray();
        string[] names = localNames.Intersect(ctorNames).ToArray();
        foreach (string s in names)
        {
            PropertyInfo propSet = this.GetType().GetProperty(s);
            PropertyInfo propGet = typeof(Cols).GetProperty(s);
            propSet.SetValue(this, propGet.GetValue(cols, null));
        }
    }
}

以下是dotnetfiddle的一个演示:https://dotnetfiddle.net/AKPYQD

答案 1 :(得分:-2)

Select

中使用匿名类型
var newList = list.Select(x => 
    new
    {
       ColA = x.ColA,
       ColB = x.ColB,
       ColC = x.ColC,
       CustomColA = x.ColA+10;
       CustomColB = x.ColB+30;
       CustomColC = x.ColC+50;
    }).ToList();

答案 2 :(得分:-3)

.Select()正在创建一个新对象。即使你刚写了:

var newList = list.Select(x => new 
{  x  });

您已获得嵌套属性。您只需要将每个列显式分配给一个新属性(您真的需要所有50个列吗?)