我有一个列表,其中一个属性是一个数字作为字符串,我想找到该列表中匹配2个数字(范围)的所有匹配。
public class car
{
public string Name { get; set; }
public string No { get; set; }
}
public void test()
{
var myList = new List<car>
{
new car {Name = "Volvo", No = "10"},
new car {Name = "Volvo", No = "20"},
new car {Name = "Volvo", No = "30"},
new car {Name = "Volvo", No = "40"},
new car {Name = "Volvo", No = "50"},
new car {Name = "Volvo", No = "60"}
};
var startNumber = 10;
var EndNumber = 30;
}
如何过滤掉my列表中的所有匹配项,其中“否”位于startNumber
和EndNumber
之内?
答案 0 :(得分:4)
这是一个非常直接的解决方案:
myList
.Where(car => startNumber <= int.Parse(car.No) && int.Parse(car.No) <= EndNumber)
.ToList();
注意:如果我们不能假设No
只包含自然数,那么使用int.TryParse
将是int.Parse
的更好选择。
备注:
No
保存为int
而不是string
。Number
或LicensePlate
,它会更长一些,但更简洁。Car
,Animal
Local variables
中的第一个字母应该是较低的。例如:endNumber
var
,int
等基本变量等时,避免使用double
是一种很好的做法。答案 1 :(得分:1)
您必须将数字解析为整数,然后比较范围。您还可以使用Int.TryParse
来避免异常。要进行一次解析,请创建一个匿名类型,然后查询:
int temp;
var query = myList.Select(r => new
{
Car = r,
NumericNo = int.TryParse(r.No, out temp) ? temp : 0 //or -1 for invalid values
})
.Where(r => r.NumericNo >= start && r.NumericNo <= end)
.Select(r => r.Car);