zee
zee

Reputation: 49

How to get last duplicate item from a list

I have a list which contains duplicate items, and what I need is to get only the last entry of that items.

What I tried to do is below, but can't find any further solution to achieve what I need to.

     List<ListItem> listItems = new List<ListItem>
        {
            new ListItem{ Item1="Item1", Item2="Item2"},
            new ListItem{ Item1="Item2", Item2="Item22"},
            new ListItem{ Item1="Item3", Item2="Item23"},
            new ListItem{ Item1="Item4", Item2="Item24"},
            new ListItem{ Item1="Item4", Item2="Item244"},
            new ListItem{ Item1="Item4", Item2="Item244"},
            new ListItem{ Item1="Item5", Item2="Item25"},
            new ListItem{ Item1="Item1", Item2="Item12"},
            new ListItem{ Item1="Item6", Item2="Item26"},
            new ListItem{ Item1="Item7", Item2="Item27"},
            new ListItem{ Item1="Item1", Item2="Item22"},
            new ListItem{ Item1="Item8", Item2="Item28"},
            new ListItem{ Item1="Item9", Item2="Item29"},
            new ListItem{ Item1="Item8", Item2="Item288"},
            new ListItem{ Item1="Item10", Item2="Item210"},
            new ListItem{ Item1="Item8", Item2="Item288"},
            new ListItem{ Item1="Item11", Item2="Item211"},
        };

        listItems.GroupBy(x => x.Item1).ToList().ForEach(r =>
                {
                    //Want to get last item w.r.t. "r". because I have a complex scenario that if something does not works I also have to get second  last record, so I don't want to lose GroupBy list.
                    foreach (var item in r)
                 {
                        Console.WriteLine(item.Item1 + " " + item.Item2);
                 }
                });

Expected Output:

Item1 Item22
Item2 Item22
Item3 Item23
Item4 Item244
Item5 Item25
Item6 Item26
Item7 Item27
Item8 Item288
Item9 Item29
Item10 Item210
Item11 Item211

Upvotes: 0

Views: 1228

Answers (3)

Rahul Singh
Rahul Singh

Reputation: 21825

I guess you need for each Item1 the last item:-

var result = listItems.GroupBy(x => x.Item1)
                      .Select(x => new
                            {
                               Item1 = x.Key,
                               Item2 = x.OrderByDescending(z => z.Item2).First().Item2
                            });

Working Fiddle.

Update:

I guess you need List<ListItem> as output type. Well for that you can use this:-

List<ListItem> res = listItems.GroupBy(x => x.Item1)
                              .Select(x =>
                                  {
                                       var lastItem = x.Last(); 
                                            //Or x.OrderByDescending(z => z.Item2).First()
                                       return new ListItem
                                          {
                                             Item1 = x.Key,
                                             Item2 = lastItem.Item2
                                          };
                                  }).ToList();

Getting following output:-

enter image description here

Upvotes: 1

Richard Schneider
Richard Schneider

Reputation: 35477

Assuming that a duplicate is based on Item, then just get the Last element in a GroupBy.

var nodups = listItems
   .GroupBy(x => x.Item1)
   .Select(g => g.Last());
foreach (var item in nodups)
   Console.WriteLine(item.Item1 + " " + item.Item2);

Upvotes: 4

Sateesh Pagolu
Sateesh Pagolu

Reputation: 9606

fiddle : https://dotnetfiddle.net/TMAcie

    var result = listItems
                .GroupBy(x=>new {x.Item1,x.Item2})
                .Select(g=>new {Item1 = g.Key.Item1,Item2 = g.Max(m=>m.Item2)});

If criteria for duplicates is with Item1

    var result = listItems
                .GroupBy(x=>x.Item1)
                .Select(g=>new {Item1 = g.Key,Item2 = g.Max(m=>m.Item2)});

Upvotes: 1

Related Questions