我有一个包含多个列表的列表,我想选择只有第二个值大于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。
答案 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();