2011-03-22 85 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