从列表中获取大于特定值的列表usinq linq c#

时间:2018-02-15 17:56:14

标签: c# linq

我有一个包含多个列表的列表,我想选择只有第二个值大于1的列表

List<List<object>> lists = new List<List<object>>();
    lists.Add(new List<object> { "zxc", 0.1, 3 });
    lists.Add(new List<object> { "dfg", 0.3, 7 });
    lists.Add(new List<object> { "abc", 0.8, 3 });
    lists.Add(new List<object> { "fhc", 1.7, 8 });
    lists.Add(new List<object> { "ghr", 5.5, 9 });
foreach (var list in lists.(LINQ here ?))
    { //TODO
    }

我只需要使用第二个值大于1的列表执行foreach循环,在这种情况下只列出4,5。

2 个答案:

答案 0 :(得分:1)

正如juharr所说,使用适当的属性类。但简短而肮脏的答案是lists.Where(l => (double)l[1] > 1);,但它假设你的内部列表中至少有两个对象,而第二个始终是double。这就是为什么你应该使用强类型对象的强类型对象。

处理它的正确方法如下:

public class MyStuff
{
    public List<MyThing> Things { get; set; }
}

public class MyThing
{
    public string Name {get; set;}
    public double SomeValue {get; set;}
    public int SomeInt {get; set;}
}

var stuff = new MyStuff()
{
    Things = new List<MyThing>()
    {
        new MyThing() { Name = "dfg", SomeValue = 0.3, SomeInt = 7 },
        new MyThing() { Name = "fhc", SomeValue = 1.7, SomeInt = 8}
    }
};

var filtered = stuff.Things.Where(t => t.SomeValue > 1);

但最好是有意义的类和属性名称!

在这种情况下,Things只能包含MyThing的实例,而不包含任何其他内容。并且MyThing将始终具有SomeValue(默认为零,除非您对其执行其他操作),因此>1测试永远不会抛出异常

答案 1 :(得分:0)

我稍微更新了代码..它看起来像这样,我同意其他注释,最好在可能的情况下使用强类型对象来进行编译时检查。

List<List<object>> lists = new List<List<object>>();
    lists.Add(new List<object> { "zxc", 0.1, 3 });
    lists.Add(new List<object> { "dfg", 0.3, 7 });
    lists.Add(new List<object> { "abc", 0.8, 3 });
    lists.Add(new List<object> { "fhc", 1.7, 8 });
    lists.Add(new List<object> { "ghr", 5.5, 9 });
var result = lists.Where(o => (double)o[1] > 1).ToList();

我更愿意这样做:

private class MyClass
{
    public MyClass(string field1, double field2, int field3)
    {
        this.Field1 = field1;
        this.Field2 = field2;
        this.Field3 = field3;
    }

    public string Field1 { get; set; }
    public double Field2 { get; set; }
    public int Field3 { get; set; }
}

var lists = new List<MyClass>{
    new MyClass( "zxc", 0.1, 3), 
    new MyClass( "dfg", 0.3, 7), 
    new MyClass( "abc", 0.8, 3), 
    new MyClass( "fhc", 1.7, 8), 
    new MyClass( "ghr", 5.5, 9)  
};
var result = lists.Where(mc => mc.Field2 > 1).ToList();