2011-03-22 44 views
3

我有一个对象的列表,它们被键入或由其属性之一唯一标识为“ID”。我需要将所有具有相同属性的不同ID的对象进行分组。相同类别的组对象C#

示例:Obj具有属性“ID”,“E1”,“E2”,“E3”。注意这些是Obj的所有属性。

我知道ID对于所有的Obj列表是不同的,但是如果E1,E2和E3对于不同的Obj是相同的,那么它们就会分组。所以我会有一些Obj的数组有相同的E1,E2,E3但是不同的ID。

在C#中处理这个问题的最简单方法是什么?

回答

9

好,像这样的使用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); 
    } 
} 
0

实现对象之间公共属性/方法的接口。使用接口类型进行交互。

0

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>(); 
} 
+1

这样做* *排序,而不是分组 – BrokenGlass 2011-03-22 18:01:50

+0

@BrokenGlass这确实订货顺带做分组,更一般的意义。尽管如此,我很容易承认,@Jon Skeet正如我们所期待的那样把我踢到这一块,而这可能不是最好的办法。 – Andrew 2011-03-22 18:03:07

+0

虽然您是通过ID * first *订购的,这意味着根本无法通过E1,E2和E3进行分组。如果您是通过ID最后排序*,那么您可以使用这些有序的结果,并在E1/E2/E3元组更改时发现,但因为这是我认为这不是对问题有用的答案。 – 2011-03-22 18:10:27