我有一个 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。
最佳答案
让我们把问题分解成几个组成部分:
- 我需要将每个字典中的 ID 条目提取到一个集合中。
- 我需要将该值转换为整数。
- 我需要获得该集合的最大值。
我们如何通过键访问字典条目的值? 我的字典[“键”]
。这很脆弱,因为它假定字典将始终具有包含该键的条目。如果没有,它将抛出异常。
我们如何使用 LINQ 从现有序列生成新的对象序列? 选择()
。描述源中每个对象的输出对象。
我们使用 int.Parse
从字符串中获取一个 int。这很脆弱,通常是一个禁忌,因为如果该字符串值不是完美的整数,它将抛出异常。但为简单起见,假设我们可以假设所有字符串始终是整数,就像您所说的那样。
最后一点是最简单的 - Max() 适用于可比较项目的任何序列:
var maxId = theList.Select(dict => int.Parse(dict["id"].ToString())).Max();
现在一个更安全的版本会确保做两件事:
- 检查字典是否确实有“id”条目,如果没有,决定如何处理它。
- 检查条目值是否确实可以转换为整数,如果不能,则决定如何处理。
这是一种跳过不满足这两个要求的条目的方法。如果没有通过的条目,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/