C#LINQ获取字典计数

本文关键字:字典 获取 C#LINQ | 更新日期: 2023-09-27 18:21:49

我得到了一个带有实体框架(EF)的LINQ查询,并得到了项目列表。现在,我想创建一个字典,其中包含项目和项目本身的递增索引。

我有这样的:

result = context
    .Items
    .Where(b => !b.Deleted)
    .OrderBy(b => b.Name)
    .ToDictionary(COUNTHERE, b => b.Name)

所以字典必须是这样的:

1: "item1"
2: "item2"
3: "item5"
4: "item10"
5: "item100"

C#LINQ获取字典计数

我认为您需要的是将项名称作为键,而不是将计数作为键,因为如果有两个项具有相同的计数,则会引发添加了键的异常。

然后你可以在ToDictionary之前使用GroupBy,这样你就可以计数了

result = context
    .Items
    .Where(b => !b.Deleted)
    .GroupBy(x => x.Name)
    .ToDictionary(g => g.Key, g => g.Count())
    .OrderBy(g => g.Key);

根据你更新的评论,那么你需要的是

result = context
    .Items
    .Where(b => !b.Deleted)
    .OrderBy(b => b.Name)
    .AsEnumerable()
    .Select((v,i) => new { i, v.Name })
    .ToDictionary(g => g.i + 1, g => g.Name);

请注意,您需要添加AsEnumerable,以便Select子句充当对象的linq(L2S中不支持接受索引的Select)。

只需使用:

int count = 0;
var result = context
    .Items
    .Where(b => !b.Deleted)
    .OrderBy(b => b.Name)
    .ToDictionary(b => ++count, b => b.Name);

实现这一目标的另一种方法是:

var sortedNames = context
    .Items
    .Where(b => !b.Deleted)
    .Select(b => b.Name)
    .OrderBy(b => b.Name)
    .ToArray();
result = Enumerable.Range(1, sortedNames.Length)
    .ToDictionary(i => i, i => sortedNames[i - 1]);

要获得基于零的编号,请改用Enumerable.Range(0, sortedNames.Length)sortedNames[i]