如何在2个数字之间找到linq列表中的所有匹配项

时间:2015-07-06 15:04:43

标签: c# linq

我有一个列表,其中一个属性是一个数字作为字符串,我想找到该列表中匹配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列表中的所有匹配项,其中“否”位于startNumberEndNumber之内?

2 个答案:

答案 0 :(得分:4)

这是一个非常直接的解决方案:

myList
    .Where(car => startNumber <= int.Parse(car.No) && int.Parse(car.No) <= EndNumber)
    .ToList();

注意:如果我们不能假设No只包含自然数,那么使用int.TryParse将是int.Parse的更好选择。

备注:

  1. 我强烈建议您将No保存为int而不是string
  2. 在物业名称上也不便宜,如果您使用NumberLicensePlate,它会更长一些,但更简洁。
  3. 您应该使用带有大写字母的类名来遵循.NET命名约定。例如:CarAnimal
  4. Local variables中的第一个字母应该是较低的。例如:endNumber
  5. 在使用varint等基本变量等时,避免使用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);

您也可以关注General Naming Conventions