【问题标题】:c#: Linq with Dictionary with multiple conditionsc#:带有多个条件的字典的Linq
【发布时间】:2019-02-28 09:50:28
【问题描述】:

所以我有ListDictionary<string, object> 我想用 2 个列名的条件解析 1 个项目:

如果我搜索列名为“Id”的 1 个项目,我会这样做:

var collection ....

var result = collection.OfType<Dictionary<string, object>>()
    .SelectMany(d => d.Where(x => x.Key == "id"))
    .Where(x => x.Value?.ToString() == "1234")
    .ToList();

我在这里搜索列名为Id 的项目,其值为1234,这很好。

现在我想添加一些条件:

我想搜索列名 Id 和值 1234 和列名 "Class" 的项目,我想获得 "Class" 列名值。

有什么建议吗?

【问题讨论】:

  • 你问题的最后一部分有点令人困惑。以表格形式显示输入和预期输出会有所帮助。
  • 看起来您的集合中的项目是动态对象,其属性名称在键中,它们的值在值中(很有可能您只是错误地反序列化了 JSON 或其他东西),所以我不选择具体的属性建议您将此字典转换为 DTO,然后执行最先进的选择和过滤。

标签: c# linq dictionary


【解决方案1】:

从根本上说,您的SelectMany 正在压平所有字典中的所有条目。这意味着当您获得键/值对时,您不知道哪对来自哪个字典。在您描述的情况下,您不想这样做。您想要过滤到特定项目,然后选择每个项目的一个方面。

您可以使用下面的代码。我假设collectionList&lt;Dictionary&lt;string, object&gt;&gt; 类型,所以你现在不需要OfType 调用。

var result = collection
    // Filter to items with the correct ID.
    .Where(d => d.TryGetValue("Id", out var id) && id?.ToString() == "1234")
    // Filter to items containing a "Class" entry
    .Where(d => d.ContainsKey("Class"))
    // Select the class
    .Select(d => d["Class"])
    .ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2011-07-15
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多