我有一個對象的列表,它們被鍵入或由其屬性之一唯一標識爲「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