Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C Linq在字典列表上对其进行筛选_C#_.net_List_Linq_Dictionary - Fatal编程技术网

C# C Linq在字典列表上对其进行筛选

C# C Linq在字典列表上对其进行筛选,c#,.net,list,linq,dictionary,C#,.net,List,Linq,Dictionary,我有一个问题,不知道如何正确使用LINQ 我有一个字典字符串列表,对象如下: [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":"c

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

我有一个字典字符串列表,对象如下:

[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的字典,因此输出应该是:

[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; }
}
现在您可以创建这些类型的实例,而不必处理对象。例如

您还可以将其放入集合:

var myList = new[] { m };
甚至从该列表中选择满足条件的元素:

var result = myList.Where(x => x.Field1 == 1500);
请注意,Field1的类型为integer,因此如果您将该值与MyValue进行比较,则会出现编译器错误。在您的解决方案中,dicitonaries值属于object类型,因此您可以将任何内容存储到Field1中,而不仅仅是数字


除此之外,您还应该为您的成员使用一些有意义的名称,例如颜色而不是字段2,动物而不是字段2。

同时您可以将整个模型作为集合集合来编写。。。这只是一个好主意,因为它不可能被理解和维持。您应该明确创建自己的类,例如:

class MyClass
{
    public int Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }
}
现在您可以创建这些类型的实例,而不必处理对象。例如

您还可以将其放入集合:

var myList = new[] { m };
甚至从该列表中选择满足条件的元素:

var result = myList.Where(x => x.Field1 == 1500);
请注意,Field1的类型为integer,因此如果您将该值与MyValue进行比较,则会出现编译器错误。在您的解决方案中,dicitonaries值属于object类型,因此您可以将任何内容存储到Field1中,而不仅仅是数字

除此之外,您还应该为您的成员使用一些有意义的名称,例如颜色而不是字段2,动物而不是字段2。

这应该适用于:

var result = 
    dicts.Where(
        d => d.TryGetValue("field1", out object value) && value is int i && i == 1500
    ).ToList();
这将通过d.TryGetValue选择列表中具有名为field1的字段的所有词典,其中该值也是1500

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

还要注意,此语法使用的是C版本7或更高版本。

这应该可以:

var result = 
    dicts.Where(
        d => d.TryGetValue("field1", out object value) && value is int i && i == 1500
    ).ToList();
这将通过d.TryGetValue选择列表中具有名为field1的字段的所有词典,其中该值也是1500

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


还要注意的是,这种语法使用的是C版本7或更高版本。

我还没有找到正确的答案,为什么你会这样想?您得到的结果是什么?不要将集合用作属性,而是学习实现自定义类List FilterAdditionaries=dictionary.Wheredictionary=>dictionary.ContainesKeyField1&&intdictionary[field1]==1500.ToList;可能是@LeonidVasilyev的复制品这是一种被认为是复制品的泛型。我根本就没有找到正确的答案。你为什么这么认为?您得到的结果是什么?不要将集合用作属性,而是学习实现自定义类List FilterAdditionaries=dictionary.Wheredictionary=>dictionary.ContainesKeyField1&&intdictionary[field1]==1500.ToList;可能是@LeonidVasilyev的复制品,这是将其视为复制品的一般方法。谢谢你,你的回答完全符合我的需要@否决票:我很想知道这个答案被否决的原因。我如何改进这个答案?没有解释的否决票不是特别有用…谢谢你,你的回答完全符合我的需要@否决票:我很想知道这个答案被否决的原因。我如何改进这个答案?没有解释的否决票不是特别有用。。。