【问题标题】:C# LINQ get count to dictionaryC# LINQ 获取字典计数
【发布时间】:2014-09-15 08:58:55
【问题描述】:

我得到了一个带有Entity Framework (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"

【问题讨论】:

  • 您需要反转键值。想想如果 item1item5 出现 3 次会发生什么。
  • 项目名称在数据库中是唯一的
  • 什么?如果这些项目是独一无二的,那么你到底为什么需要计算它们呢?计数始终为 1...
  • 我认为他的意思是递增索引,而不是计数。
  • @AndreiV 如果密钥只是一个自动递增的整数,我猜它会是唯一的。我真的不知道。这个问题有点混乱。

标签: c# linq entity-framework dictionary counter


【解决方案1】:

我认为你需要的是将项目名称作为键而不是计数作为键,因为如果有两个项目具有相同的计数,则会抛出已添加键的异常。

那么你可以在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 to object(L2S 不支持接受索引的Select)。

【讨论】:

  • 谢谢!这就是我想要的。也感谢您的注意:)
  • 第一个 result = context... - GroupBy 将按名称排序,并且名称是唯一的,因此 g.Count() 将始终为 1。或者我可能遗漏了什么......? :-.
  • @Default,你说得对,第一部分应该是 1,如果它本来应该是,无论如何,它已经过时了,谢谢
【解决方案2】:

只需使用:

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

【讨论】:

  • +1,新知识,在 ToDictionary 中传递局部变量可以正常工作
【解决方案3】:

实现此目的的另一种方法是:

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多