使用linq列表中的不同值

时间:2017-04-12 10:33:56

标签: c# linq

我有一个对象列表,我希望根据数组从中获取另一个不同值的列表。

用示例解释我的问题

原始列表

// Class of the object
class Obj
{
    public string Name { get; set; }
    public string Surname { get; set; }
    public string Address { get; set; }
}

// List of the object
List<Obj> objects = new List<Obj>();

//Values in the list
Obj a = new Obj();
a.Name = "Jack";
a.Surname = "Grey";
a.Address = "Sheffield";
objects.Add(a);

Obj b = new Obj();
b.Name = "John";
b.Surname = "Grey";
b.Address = "Sheffield";
objects.Add(b);

Obj c = new Obj();
c.Name = "Jack";
c.Surname = "Grey";
c.Address = "London";
objects.Add(c);

现在我想要另一个列表,它具有不同的值,具体取决于数组

string[] ColArray = new string[2] {"Name", "Surname"};

我该怎么办?基本上有另一个列表,其中包含数组中不同的列

List<Obj> NewList = objects.GroupBy( what to put here ).Select(x => x.First()).ToList();

我的NewList将包含a和b

的对象

1 个答案:

答案 0 :(得分:2)

您可以使用System.Linq.Dynamic完成此操作,如下所示:

  1. 获取Nuget包
  2. 以下是代码(在LinqPad上,否则用Dump替换Console.WriteLine调用):

    string[] ColArray = new string[] {"Name","Surname"};
    
    string groupingString = "new(" + string.Join(",",ColArray) + ")";
    
    var groupedObjectData = objects.GroupBy(groupingString,"it");
    
    foreach (IGrouping<DynamicClass, Obj> objGroup in groupedObjectData)
    {
        objGroup.Select(x => x).Dump();
    }
    

    要点:

    1. ColArray可以修改为包含1个或1个以上的列,它会自动调整
    2. 默认情况下,分组键为DynamicClass,分组值为obj class类型
    3. 分组语句中的
    4. “it”是用于选择所有列而不是特定列的Dynamic Linq关键字
    5. <强>结果:

      enter image description here