Mam dwóch list:Różnica pomiędzy dwoma listami zachowaniu duplikaty
var list1 = new List<string> { "A", "A", "B", C" };
var list2 = new List<string> { "A", "B" };
i chciałbym produkować listę jak
var result = new[] { "A", "C" };
Jeżeli lista jest wszystkie elementy z list1
usunięte z list2
I nie sądzę, że istnieje metoda rozszerzenia Linq, ponieważ Except
usuwa duplikaty.
Non-LINQ sposób to zrobić byłoby:
var tempList = list1.ToList();
foreach(var item in list2)
{
tempList.Remove(item);
}
ale zastanawiam się, czy istnieje metoda rozszerzenie LINQ że mógłbym przegapić.
Edit:
Ponieważ zapewne nie ma żadnych oto metodę rozszerzenia zrobiłem.
public static class LinqExtensions
{
public static IEnumerable<T> RemoveRange<T>(this IEnumerable<T> source, IEnumerable<T> second)
{
var tempList = source.ToList();
foreach(var item in second)
{
tempList.Remove(item);
}
return tempList;
}
public static IEnumerable<TFirst> RemoveMany<TFirst, TSecond>(this IEnumerable<TFirst> source, IEnumerable<TSecond> second, Func<TSecond, IEnumerable<TFirst>> selector)
{
var tempList = source.ToList();
foreach(var item in second.SelectMany(selector))
{
tempList.Remove(item);
}
return tempList;
}
}
Zastosowanie:
list1.RemoveRange(list2)
Listy mają dowolny rozmiar, więc jeden z nich może być większy. – Romoku
Nie ma żadnych założeń dotyczących względnej wielkości list. – Ani
Och, domyślam się, że źle rozumiem, co masz na myśli przez "wszystkie elementy z listy2 usunięte z listy1" – Romoku