У меня есть два списка:разница между двумя списками сохранением дубликатами
var list1 = new List<string> { "A", "A", "B", C" };
var list2 = new List<string> { "A", "B" };
, и я хотел бы получить список как
var result = new[] { "A", "C" };
Если список всех элементов из list1
удален из list2
I не думаю, что для этого существует метод расширения Linq, так как Except
удаляет дубликаты.
Не-LINQ способ сделать это было бы:
var tempList = list1.ToList();
foreach(var item in list2)
{
tempList.Remove(item);
}
, но мне интересно, если есть способ расширения Linq, что я, возможно, пропустили.
Edit:
Поскольку, вероятно, не являются какой-либо здесь метод расширения я сделал.
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;
}
}
Использование:
list1.RemoveRange(list2)
Списки произвольно по размеру, поэтому любой из них может быть больше. – Romoku
Здесь нет предположений относительно относительных размеров списков. – Ani
О, я думаю, я ошибаюсь, что вы подразумеваете под «всеми элементами из списка2, удаленными из списка1». – Romoku