使用linq过滤嵌套集合

时间:2015-07-09 05:05:56

标签: c# linq

我有两个类,一个嵌套在另一个中,

class Person
{
    public string Name;
    public string SSN;
    public List<Car> CarsOwnedByHim;

}

和另一辆车

class Car
{
    public string RegNo; 
    public string Make;
    public string ModelName;
}

来自List<Person>我想过滤掉所有车型,比如ModelName =&#34; Corolla&#34;。

请注意,应返回person实例,但在嵌套列表中,只应筛选出汽车。

以下解决方案正在运作,但我正在寻找更优雅的解决方案。

List<Person> lstPersons = new List<Person>();
foreach (var person in _result)
{
    List<Car> lstCars = new List<Car>();
    foreach (var car in person)
    {
        if (car.ModelName != "Corolla")
            lstCars.Add(car);
    }
    var tempPerson = person;
    tempPerson.CarsOwnedByHim = lstCars;
    lstPersons.Add(tempPerson);

}
return lstPersons ;

这只是原始问题的修改版本.TIA。

6 个答案:

答案 0 :(得分:5)

试试这个。您可以使用list这样的not equal子句获取Where个人的lstCars = person.CarsOwnedByHim.Where(x => x.ModelName.ToUpper() != "COROLLA").ToList(); 个汽车

List<Person> lstPersons = new List<Person>();
foreach (var person in _result)
{
    List<Car> lstCars = new List<Car>();
    lstCars=person.CarsOwnedByHim.Where(x => x.ModelName.ToUpper() != "COROLLA").ToList();
    person.CarsOwnedByHim = lstCars;
    lstPersons.Add(person);

}
return lstPersons ;

你的整个代码就像这样

x = (int *) malloc(n);

答案 1 :(得分:2)

这是一个精简版的lambda版本:

persons.ForEach(p => p.CarsOwnedByHim.RemoveAll(c => c.ModelName == "Corolla"));

答案 2 :(得分:1)

要获取已移除Corollas的人员列表,并单独保留原始列表:

var lstPersons = (
    from p in _result
    select new Person() {
        Name = p.Name,
        SSN = p.SSN,
        CarsOwnedByHim = p.CarsOwnedByHim.Where(t=>t.ModelName != "Corolla").ToList()
    }).ToList();

如果您想编辑原始列表:

foreach (var person in _result)
    person.CarsOwnedByHim = 
        person.CarsOwnedByHim
        .Where(t=>t.ModelName != "Corolla")
        .ToList()

答案 3 :(得分:0)

使用linq很棒:

$scope.$on('myComponent.error', function (event, data) {
 console.log(data);
 // show message, redirect or something else

确保包含linq

的using语句

你可以拥有无​​限制的where子句,只需在第一个

下添加它
List<Car> carStatus =
    (from car in person
      where car.ModelName != "Corolla"
      select car).ToList();

确保在最后执行.ToList或.Single或.SingleOrDefault查询数据,直到用.ToList或类似的东西调用它们才会查询它。

如果要选择子模型或属性,可以在选择中执行:

List<Car> carStatus =
    (from car in person
      where car.ModelName != "Corolla"
      where car.Color == "blue"
      select car).ToList();

答案 4 :(得分:0)

您可以像这样使用交叉连接

var combo = from p in Person
            from c in cars.Where(t=>t.ModelName != "Corolla")
            select new
            {
                Name=p.Name,
                SSN=p.SSN,
                CarsOwnedByHim=c.ToList()
            };

答案 5 :(得分:0)

尝试一下:

var cars = (from p in persons
        from c in p.CarsOwnedByHim
        where c.ModelName == "Corolla"
        select c).ToList();