[c#] 用分組在列表上創建一本詞典



Answers

只是為了讓姆甘德的建議具體化:

var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                             .GroupBy(x => x.GroupKey)
                             .ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

當然,如果你使用較短的變量名稱,你會縮短它:)

但是,我可以建議Lookup可能更合適嗎? Lookup基本上是一個從IEnumerable<T>的鍵的字典 - 除非你真的需要這些值作為列表,它使得代碼在ToLookup調用中更短(更高效):

var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                             .ToLookup(x => x.GroupKey);
Question

我在列表中有以下對象:

public class DemoClass
{
    public int GroupKey { get; set; }
    public string DemoString { get; set; }
    public object SomeOtherProperty { get; set; }
}

現在,我想創建以下字典:

Dictionary<int, List<DemoClass>>

我想通過屬性GroupKeyList<DemoClass> GroupKey List<DemoClass>進行GroupKey ,但我不明白這是如何完成的,有些幫助。

思考一下後,我通過以下方式實現了所需的行為:

var groupedDemoClasses = from demoClass in mySepcialVariableWhichIsAListOfDemoClass
                            group demoClass by demoClass.GroupKey
                            into groupedDemoClass
                            select groupedDemoClass;
var neededDictionary = groupedDemoClass.ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

但是,有沒有辦法將它變成一個單獨的聲明?




我在這裡稍微偏離主題,但是我得到了這個線程becausde我正在尋找一種方法來創建Linq中的字典字典,並且這裡的對話使我得到了答案...

可以使用linq創建多級字典,這對於您想要搜索多個關鍵字或維度的場景很有用。 訣竅是創建一個分組,然後將其轉換為字典,如下所示:

  Dim qry = (From acs In ActualSales _
             Group By acs.ProductID Into Group _
             Select ProductID, Months = Group.ToDictionary(Function(c) c.Period) _
            ).ToDictionary(Function(c) c.ProductID)

結果查詢可以使用如下:

 If qry.ContainsKey(_ProductID) Then
      With qry(_ProductID)
          If .Months.ContainsKey(_Period) Then
             ...
          End If
      End With
 End If

希望這對任何需要這種查詢的人都有幫助。




Links