C# 使用linq将值与列表区分开来

C# 使用linq将值与列表区分开来,c#,linq,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

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

用一个例子来解释我的问题

原始列表

// 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);
我怎么能做这样的事?基本上,我们有另一个列表,其中包含与数组不同的列

List<Obj> NewList = objects.GroupBy( what to put here ).Select(x => x.First()).ToList();
List NewList=objects.GroupBy(放在这里的内容)。选择(x=>x.First()).ToList();

我的新列表将包含a和b的对象

您可以使用
System.Linq.Dynamic
实现它,如下所示:

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

    string[]ColArray=新字符串[]{“Name”,“姓氏”};
    string groupingString=“new(“+string.Join(“,”,ColArray)+”);
    var groupedObjectData=objects.GroupBy(groupingString,“it”);
    foreach(groupedObjectData中的iGroup对象组)
    {
    选择(x=>x.Dump();
    }
    
    要点:

  • ColArray可以修改为有1个或多个列,它将自动调整
  • 默认情况下,分组键是
    动态类
    ,分组值是
    对象类
    类型
  • 分组语句中的“it”是用于选择所有列而不是特定列的动态Linq关键字
  • 结果:


    是否要区分对象值?是,我希望根据列值区分对象。列在arrayDistinct中定义,在什么列上,名称字段aloneCheck No-数组中定义的所有列。数组值是在运行时定义的。
    List<Obj> NewList = objects.GroupBy( what to put here ).Select(x => x.First()).ToList();
    
    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();
    }