簡體   English   中英

館藏集合VS C#館藏字典?

[英]Collection of Collections VS Dictionary of Collections in C#?

情況:我需要傳遞一組對象,然后對它們進行分組。 我知道我可以為此使用LINQ。

但是,如果我自己做的話, 讓我的方法返回“收藏集VS收藏集字典”之間是否有任何偏好? 我知道Dictionary也是一個集合,但是它引入了key參數。

  • 返回的對象的預期用途是使用For Each語句按組顯示。
  • 原始收藏集中的平均數量約為20,因此性能不是問題。

提前致謝。

總結評論:

  • 如果您確實需要查找特定項目,請執行以下操作: Dictionary =>因為查找時間為O(1)
  • 如果您只需要遍歷所有項目:兩者都可以,因為兩種情況下的查找時間均為O(n)

如果您想向用戶展示內容,並且說您願意,那么Dictionary幾乎肯定是錯誤的方法。 Dictionary沒有可預測的順序。 按照從Dictionary中檢索它們的順序顯示Dictionary中的Dictionary是沒有意義的。

如果鍵的順序與項目的預期順序匹配,則始終按鍵值排序的SortedDictionarySortedList可能是合適的。

但是否則,只需使用常規數組/ 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表示任何合適的集合類型( IEnumerableIList ,...)。

我的答案是:讓客戶決定。 如果您返回分組,則讓返回類型為:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM