我有一个对象的列表,它们被键入或由其属性之一唯一标识为“ID”。我需要将所有具有相同属性的不同ID的对象进行分组。相同类别的组对象C#
示例:Obj具有属性“ID”,“E1”,“E2”,“E3”。注意这些是Obj的所有属性。
我知道ID对于所有的Obj列表是不同的,但是如果E1,E2和E3对于不同的Obj是相同的,那么它们就会分组。所以我会有一些Obj的数组有相同的E1,E2,E3但是不同的ID。
在C#中处理这个问题的最简单方法是什么?
我有一个对象的列表,它们被键入或由其属性之一唯一标识为“ID”。我需要将所有具有相同属性的不同ID的对象进行分组。相同类别的组对象C#
示例:Obj具有属性“ID”,“E1”,“E2”,“E3”。注意这些是Obj的所有属性。
我知道ID对于所有的Obj列表是不同的,但是如果E1,E2和E3对于不同的Obj是相同的,那么它们就会分组。所以我会有一些Obj的数组有相同的E1,E2,E3但是不同的ID。
在C#中处理这个问题的最简单方法是什么?
好,像这样的使用LINQ工作:
var groups = collections.GroupBy(x => new { x.E1, x.E2, x.E3 });
这会给你的分组序列,你可以遍历。例如:
var groups = collections.GroupBy(x => new { x.E1, x.E2, x.E3 });
foreach (var group in groups)
{
Console.WriteLine("Key: {0}", group.Key);
foreach (var item in group)
{
Console.WriteLine(" ID: {0}", item.ID);
}
}
实现对象之间公共属性/方法的接口。使用接口类型进行交互。
Linq听起来不错。
public class YourClass
{
public string ID { get; set; }
public string E1 { get; set; }
public string E2 { get; set; }
public string E3 { get; set; }
}
public static YourClass[] GetClassArray(IEnumerable<YourClass> objects)
{
return objects.OrderBy<YourClass, string>(c => c.E1)
.ThenBy<YourClass, string>(c => c.E2)
.ThenBy<YourClass, string>(c => c.E3)
.ThenBy<YourClass, string>(c => c.ID)
.ToArray<YourClass>();
}
这样做* *排序,而不是分组 – BrokenGlass 2011-03-22 18:01:50
@BrokenGlass这确实订货顺带做分组,更一般的意义。尽管如此,我很容易承认,@Jon Skeet正如我们所期待的那样把我踢到这一块,而这可能不是最好的办法。 – Andrew 2011-03-22 18:03:07
虽然您是通过ID * first *订购的,这意味着根本无法通过E1,E2和E3进行分组。如果您是通过ID最后排序*,那么您可以使用这些有序的结果,并在E1/E2/E3元组更改时发现,但因为这是我认为这不是对问题有用的答案。 – 2011-03-22 18:10:27