C# LINQ 查询一个List<Dicitonary<string, object>>

标签 c# linq list dictionary

我有一个 List<Dictionary<string, object>>其中 Dictionary<string, object>就像:

我必须使用 Dictionary<string, object>因为我从 API 检索不同的对象并指定每个对象是不可行的。

{
    [id, 12345],
    [action, SUBMIT],
    [comment, blah blah]
    ...
},
{
    [id, 98765],
    [action, DECLINE],
    [comment, yak yak]
    ...
}

'id' 总是一个整数。

如何使用 LINQ 从列表中查询最大 ID?在这种情况下返回 id=98765。

最佳答案

让我们把问题分解成几个组成部分:

  1. 我需要将每个字典中的 ID 条目提取到一个集合中。
  2. 我需要将该值转换为整数。
  3. 我需要获得该集合的最大值。

我们如何通过键访问字典条目的值? 我的字典[“键”]。这很脆弱,因为它假定字典将始终具有包含该键的条目。如果没有,它将抛出异常。

我们如何使用 LINQ 从现有序列生成新的对象序列? 选择()。描述源中每个对象的输出对象。

我们使用 int.Parse 从字符串中获取一个 int。这很脆弱,通常是一个禁忌,因为如果该字符串值不是完美的整数,它将抛出异常。但为简单起见,假设我们可以假设所有字符串始终是整数,就像您所说的那样。

最后一点是最简单的 - Max() 适用于可比较项目的任何序列:

var maxId = theList.Select(dict => int.Parse(dict["id"].ToString())).Max();

现在一个更安全的版本会确保做两件事:

  1. 检查字典是否确实“id”条目,如果没有,决定如何处理它。
  2. 检查条目值是否确实可以转换为整数,如果不能,则决定如何处理。

这是一种跳过不满足这两个要求的条目的方法。如果没有通过的条目,DefaultIfEmpty(-1) 会生成一个只有一个条目 -1 的序列。

int tryParse;
var onlyEntriesWithIdThatAreIntegers = theList.Where(
    dict => dict.ContainsKey("id")
        && dict["id"] != null
        && int.TryParse(dict["id"].ToString(), out tryParse))
    .DefaultIfEmpty(-1);

var max = onlyEntriesWithIdThatAreIntegers.Select(
    dict => int.Parse(dict["id"].ToString())).Max();

关于C# LINQ 查询一个List<Dicitonary<string, object>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23410126/

相关文章:

c# - 如何在没有管理员权限的情况下在 Azure Web 应用程序上安装 PowerShell 模块?

c# - 如何从 Global asax 中访问 UrlHelper.Action 或类似的

c# - 有条件地加入 LINQ

asp.net-mvc - 将本地列表操作与 linq to entities 数据库操作混合

c# - 使用 LINQ 创建 JSON 异常

list - 过滤两个列表的较大元素

c# - 如何根据用户选择动态注入(inject)用户控件

c# - 在 NHibernate 中动态引用属性?

r - 从 R 中的嵌套列表中提取内容

python - 从字符串列表中查找最常见的单词