[英]Collection of Collections VS Dictionary of Collections in C#?
情況:我需要傳遞一組對象,然后對它們進行分組。 我知道我可以為此使用LINQ。
但是,如果我自己做的話, 讓我的方法返回“收藏集VS收藏集字典”之間是否有任何偏好? 我知道Dictionary也是一個集合,但是它引入了key參數。
提前致謝。
總結評論:
如果您想向用戶展示內容,並且說您願意,那么Dictionary
幾乎肯定是錯誤的方法。 Dictionary
沒有可預測的順序。 按照從Dictionary
中檢索它們的順序顯示Dictionary
中的Dictionary
是沒有意義的。
如果鍵的順序與項目的預期順序匹配,則始終按鍵值排序的SortedDictionary
或SortedList
可能是合適的。
但是否則,只需使用常規數組/ List
/ Collection
,您就可以在其中手動按照所需的順序手動放置項目。
您已經發布了一個相當模糊的問題,但讓我們繼續進行討論,使其更加具體。 假設您有一個此類的集合:
public class MyItem
{
public string Name { get; set; }
public string Description { get; set; }
public DateTime OrderDate { get; set; }
}
並且您有一個將其分組的方法(以及可選的過濾器,...執行其他操作),如下所示:
public RETURNTYPE ProcessItemGroupedByOrderDate(IEnumerable<MyItem> items);
那應該按OrderDate
屬性分組。
您的問題是:
在讓我的方法返回“收藏集”與“收藏字典”之間是否有任何偏好? 返回的對象的預期用途是使用For Each語句按組顯示。
即RETURNTYPE
應該是
IDictionary<DateTime, ICollection<MyItem>>
或 ICollection<ICollection<MyItem>>
其中ICollection
表示任何合適的集合類型( IEnumerable
, IList
,...)。
我的答案是:讓客戶決定。 如果您返回分組,則讓返回類型為:
IEnumerable<IGrouping<DateTime, MyItem>>
除了一個明顯的決定點,即是否需要按照某些標准(如Dictionary所提供的那樣)對外部集合進行索引,通常只是每個外部項目需要多少信息。
在頻譜的一端,每個外部項目都沒有與之關聯的元數據。 外部列表中的每個項目只是一個集合,沒有標識信息。 例如,如果您按學生所在的宿舍對學生列表進行了分組,那么在遍歷列表時,您會知道所有這組學生都屬於同一個宿舍,但是您不知道哪個宿舍基於僅在您的列表中。
頻譜的中間是帶有原始鍵的字典。 現在,您可以獲得每個嵌套列表KeyValuePair Key的信息。 該密鑰可能是標識宿舍的某種唯一ID。
頻譜的另一端是無限的元數據。 您為外部列表中的項目定義一個類,並且該項目的屬性是一個集合:
class Dorm {
public int DormID {get;set;}
public string DormName {get;set;}
public Gender DormPermittedGender {get;set;}
public List<Person> Students {get;set;}
}
class Person {
public string Name {get;set;}
public Gender Gender {get;set;}
public int Age{get;set;}
}
///...
List<Dorm> dorms = db.Dorms.Select(d=>
new Dorm {
DormId = d.Id,
DormName = d.Name,
DormPermittedGender = d.PermittedGender,
Students = d.StudentsResiding
}
)
foreach(Dorm dorm in dorms)
{
foreach(Person student in dorm.Students)
{
Console.Writeline(student.Name + " lives in " + dorm.DormName);
}
}
注意foreach的可讀性。 沒有神秘的鑰匙。
現在,詞典實際上可以做到這一點,因為您可以將復雜的對象作為鍵,但是它的組織性不強。 如果情況需要,強類型對象將更好地表示這種關系。
過度使用列表或字典列表會使代碼難以閱讀,因為沒有自我描述的屬性名稱。 您遇到了一些舊的代碼,並且不得不四處尋找首先分配了Dictionary以確定Key含義的位置,因為您所擁有的只是類型,它是一個不傳達語義的int
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.