C#Linq在字典列表中进行过滤

问题描述 投票:1回答:2

我有一个问题,不知道如何正确使用LINQ。

我有这样的List Dictionaries(string, object)

[0] -> "field1":1500, "field2":"dog", "field3":"blue"
[1] -> "field1":1700, "field2":"cat", "field3":"brown"
[2] -> "field1":1500, "field2":"horse", "field3":"white"
[3] -> "field1":1900, "field2":"cow", "field3":"black"

我需要得到ListDictionaries,只有将"field1"设置为1500的字典,所以输出应该是:

[0] -> "field1":1500, "field2":"dog", "field3":"blue"
[1] -> "field1":1500, "field2":"horse", "field3":"white"

我试着这样做,但我确定我没有接近正确的答案。

List<Dictionary<string, object>> output = input.SelectMany(r => r).Where(r => (r.Key == "field1") && (r.Value == 1500)).ToList();

请问你能给我一个解决方案吗?

非常感谢你。

c# .net list linq dictionary
2个回答
1
投票

这应该工作:

var result = 
    dicts.Where(
        d => d.TryGetValue("field1", out object value) && value is int i && i == 1500
    ).ToList();

这将挑选出列表中包含field1(通过d.TryGetValue())字段的所有字典,其中该值也是1500

请注意,因为字典包含object而不是int,您需要使用int检查值是否为is int i

另请注意,此语法使用C#版本7或更高版本。


3
投票

虽然您可以将整个模型编写为集合(集合......)的集合,但这只是一个好主意,因为它无法理解和维护。你应该明确地创建自己的类,例如:

class MyClass
{
    public int Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }
}

现在你可以创建这些类型的实例,而不必搞砸object。例如。

var m = new MyType { Field1 = 1500, Field2 = "dog", Field3 = "blue" };

你也可以将它放入一个集合中:

var myList = new[] { m };

甚至从该列表中选择满足您条件的元素:

var result = myList.Where(x => x.Field1 == 1500);

请注意,Field1的类型为整数,因此如果您将值与"MyValue"进行比较,则会出现编译器错误。在您的解决方案中,dicitonaries值的类型为object,因此您可以将任何内容存储到Field1中,而不仅仅是数字。

除此之外,您还应该为您的会员使用一些有意义的名称,例如: Color而不是Field2Animal而不是Field2

© www.soinside.com 2019 - 2024. All rights reserved.