Sanooj VS
Sanooj VS

Reputation: 279

Filter a generic list based on another list

I have a generic list which needs to be filter based on another list (say, List<string>).

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

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

And the lstModel is as follows

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

And i have another list which contains only car makers,ie

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

1) I need to filter lstModel which contains only items in lstMakers. The output would be

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

2) Based on output (1), need another list of ids with 1 increment to each item in descending order, The output would be List<int> ie,

  6
  5
  3
  2

Note: Using lambda expression / linq is more preferable

Upvotes: 1

Views: 2538

Answers (2)

Tim Schmelter
Tim Schmelter

Reputation: 460028

Use Enumerable.Join and OrderByDescending:

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();

However, this selects two ints since only two models match. Your result contains 4 ints. I assume that your result is not related to your sample, is it?

but i need both the item and its incremental value,...

Now it's clear, use Enumerable.SelectMany with an array:

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

Upvotes: 2

Christos
Christos

Reputation: 53958

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();

Upvotes: 3

Related Questions