根据另一个列表过滤通用列表

时间:2014-02-19 10:45:38

标签: c# linq lambda

我有一个通用列表,需要根据其他列表进行过滤(例如List<string>)。

public class Model
{
  public string ID { get; set;}
  public string Make { get; set;}
}

List<Model> lstModel = new List<Model>();

lstModel如下

 ID      Make
----    -----------
 5       MARUTI
 4       BENZ
 3       HYUNDAI
 2       HONDA
 1       TOYOTA

我有另一个列表,其中只包含汽车制造商,即

List<string> lstMakers = new List<string>() {"MARUTI", "HONDA"};

1)我需要过滤lstModel,它只包含lstMakers中的项目。          输出将是

 ID      Make
----    -----------
 5       MARUTI
 2       HONDA

2)基于输出(1),需要另一个id列表,每个项目按降序递增1次,    输出将是List<int>,即

  6
  5
  3
  2

注意:更优选使用lambda表达式/ linq

2 个答案:

答案 0 :(得分:2)

1)

var list1 = lst.Where(x=>lstMakers.Contains(x.Make)).ToList();

2)

var list2 = list1.Select(x=>int.Parse(x.ID)+1)
                 .Concat(list1.Select(x=>int.Parse(x))
                 .OrderByDescending(x=>x)
                 .ToList();

答案 1 :(得分:2)

使用Enumerable.JoinOrderByDescending

var models = from maker in lstMakers
             join model in lstModel
             on maker equals model.Make
             select model;
List<int> result = models
    .Select(m => int.Parse(m.ID) + 1)
    .OrderByDescending(i => i)
    .ToList();

但是,这会选择两个ints,因为只有两个模型匹配。您的结果包含4个ints。我假设你的结果与你的样本无关,是吗?

  

但我需要项目及其增量值,......

现在很明显,将Enumerable.SelectMany与数组一起使用:

List<int> result = models
    .Select(m => int.Parse(m.ID))
    .SelectMany(id => new int[]{ id, id + 1 })
    .OrderByDescending(id => id)
    .Distinct()
    .ToList();