繁体   English   中英

字典列表上的C#Linq对其进行过滤

[英]C# Linq on a list of dictionaries to filter it

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

我有一个这样的Dictionaries(string, object) 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"

我需要从中获取仅具有"field1"设置为1500的词典的Dictionaries List ,因此输出应为:

[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();

请您为我提出一个解决方案?

非常感谢你。

尽管您可以将整个模型编写为一个(一个或多个)集合的集合,但这只是一个好主意,因为它不可能理解和维护。 您应该明确创建自己的类,例如:

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"进行比较,则会出现编译器错误。 在您的解决方案中,二项值的类型为object ,因此您可以将任何内容 (而不只是数字)存储到Field1

除此之外,您还应该为成员使用一些有意义的名称,例如Color代替Field2Animal代替Field2

这应该工作:

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或更高版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM