Reputation: 49
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
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
});
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:-
Upvotes: 1
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
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