Как я могу удалить дубликаты из одного списка <T>, найденные в другом? - PullRequest
1 голос
/ 26 сентября 2011

Это для .NET 2.0, поэтому я не могу использовать LINQ.

У меня есть небольшая интересная проблема.

Я объединяю два списка пользовательского типа «Статья».

Приведенный ниже код хорошо выполняет свою работу:

List<Article> merge = new List<Article>(GetFeatureArticles());
merge.AddRange(result);

return merge;

GetFeatureArticle имеет только 2 элемента, которые являются первыми двумя элементами в объединенном списке.«result» большой, и его элементы следуют за элементами «GetFeatureArticle».

Проблема заключается в том, что мне нужно сравнить список, возвращаемый из «GetFeatureArticles ()», со списком в «result» и, если естьсовпадение, удалите соответствующий элемент в результате, а не в «GetFeatureArticles».Оба списка имеют тип List<Article>.

К сожалению, я ограничен C # 2.0.

Спасибо.

РЕДАКТИРОВАТЬ, РЕДАКТИРОВАТЬ, РЕДАКТИРОВАТЬ, РЕДАКТИРОВАТЬ, РЕДАКТИРОВАТЬ, РЕДАКТИРОВАТЬ, РЕДАКТИРОВАТЬ, РЕДАКТИРОВАТЬ

Это реализация, с которой я в конечном итоге работал, так как GetFeaturedArticles () всегда будет двумя элементами:

List<Article> k = new List<Article>(GetFeatureArticles());

            foreach (Article j in k)
            {
                for( int i = 0; i < tiles.Count; i++ )
                {
                    if (j.ID == tiles[i].ID)
                        tiles.Remove(tiles[i]);
                }
            }

            k.AddRange(tiles);

            return k;

Ответы [ 5 ]

4 голосов
/ 27 сентября 2011

Предполагается, что реализовано какое-то равенство объектов.

var listA = new List<Article> {a, b, c, d};
var listB = new List<Article> {e, f}; //Where e, f are equal to b, c in a.
listA.RemoveAll(listB.Contains);
1 голос
/ 14 августа 2012
returnList = returnList.Union(ListToAdd).ToList();

или при комбинировании нескольких списков предметов ...

foreach (List<ListItem> l in ListsToAdd)
{
    returnList = returnList.Union(l).ToList();
}
1 голос
/ 26 сентября 2011

использовать

List<Article> g = new List<Article>(GetFeatureArticles());

foreach (Article a in g)
{
if (result.Contains (a))
    result.Remove (a);
}

g.AddRange (result);

return g;

РЕДАКТИРОВАТЬ - согласно комментариям:

Я предполагаю, что Article является ссылочным типом и реализован с подходящими Equals и GetHashCode методами соответственно -в противном случае приведенное выше будет работать только для одинаковых ссылок (= "один и тот же объект в обоих списках") ...

0 голосов
/ 27 сентября 2011

Это работает против .NET Framework 2.0:

var featured = new List<Article>(GetFeaturedArticles());

result.RemoveAll(featured.Contains);

result.InsertRange(0, featured);

return result;
0 голосов
/ 27 сентября 2011

Создайте Dictionary из набора result. Тогда:

foreach (Article a featuredArticles)
{
    if (resultsDictionary.ContainsKey(a.Key))
    {
        resultsDictionary.Remove(a.Key);
    }
}

Затем преобразовать словарь обратно в список.

...