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"
我认为您需要的是将项名称作为键,而不是将计数作为键,因为如果有两个项具有相同的计数,则会引发添加了键的异常。
然后你可以在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]
。