我试图使用LINQ创建一个字典<字符串,列表<CustomObject>>从一个列表<CustomObject>。我可以让这个工作使用“var”,但我不想使用匿名类型。这是我有的

var x = (from CustomObject o in ListOfCustomObjects
      group o by o.PropertyName into t
      select t.ToList());

我还尝试使用Cast<>()从LINQ库一旦我有x,但我得到编译问题的影响,它是一个无效的强制转换。


当前回答

对于@atari2600,使用lambda语法中的ToLookup,答案是这样的:

var x = listOfCustomObjects
    .GroupBy(o => o.PropertyName)
    .ToLookup(customObject => customObject);

基本上,它接受IGrouping并将其物化到一个列表字典中,以PropertyName的值作为键。

其他回答

Dictionary<string, List<CustomObject>> myDictionary = ListOfCustomObjects
    .GroupBy(o => o.PropertyName)
    .ToDictionary(g => g.Key, g => g.ToList());

对于@atari2600,使用lambda语法中的ToLookup,答案是这样的:

var x = listOfCustomObjects
    .GroupBy(o => o.PropertyName)
    .ToLookup(customObject => customObject);

基本上,它接受IGrouping并将其物化到一个列表字典中,以PropertyName的值作为键。

我不能评论@Michael Blackburn,但我猜你得到了反对票,因为GroupBy在这种情况下是不必要的。

像这样使用它:

var lookupOfCustomObjects = listOfCustomObjects.ToLookup(o=>o.PropertyName);
var listWithAllCustomObjectsWithPropertyName = lookupOfCustomObjects[propertyName]

此外,我看到这比使用GroupBy(). todictionary()要好得多。

如果你想计算单词数,这个方法可能会对你有帮助。如果你想要一个键和一个项列表,只需修改代码使值为group.ToList()

    var s1 = "the best italian resturant enjoy the best pasta";    
    var D1Count = s1.ToLower().Split(' ').GroupBy(e => e).Select(group => new { key = group.Key, value = group.Count() }).ToDictionary(e => e.key, z => z.value);


//show the results
                    Console.WriteLine(D1Count["the"]);
                    foreach (var item in D1Count)
                    {
                        Console.WriteLine(item.Key +" "+ item.Value);
                    }

下面的方法对我很有效。

var temp = ctx.Set<DbTable>()
  .GroupBy(g => new { g.id })
  .ToDictionary(d => d.Key.id);