如何从一个List <t>中删除在另一个List <t>中找到的重复项?</t>

时间:2011-09-26 19:52:44

标签: c# generics .net-2.0

这适用于.NET 2.0,所以我不能使用LINQ。

我有一个有趣的问题。

我正在合并两个自定义类型“文章”列表。

以下代码可以很好地完成工作:

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

return merge;

GetFeatureArticle只有两个项目,它们是合并列表中的前两个元素。 “结果”很大,其元素跟踪“GetFeatureArticle”的元素。

问题是我需要比较从“GetFeatureArticles()”返回的列表 到“结果”中的列表,如果匹配,则删除结果中的匹配项,而不是 在“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 个答案:

答案 0 :(得分:4)

假设您实现了某种对象相等。

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 :(得分:1)

使用

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是一个引用类型,分别用合适的EqualsGetHashCode方法实现 - 否则上面只适用于相同的引用(=“两者中的相同对象)词典“)...

答案 2 :(得分:1)

returnList = returnList.Union(ListToAdd).ToList();

或者梳理多个项目清单......

foreach (List<ListItem> l in ListsToAdd)
{
    returnList = returnList.Union(l).ToList();
}

答案 3 :(得分:0)

Dictionary集合构建result。然后:

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

然后将字典转换回列表。

答案 4 :(得分:0)

这适用于.NET Framework 2.0:

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

result.RemoveAll(featured.Contains);

result.InsertRange(0, featured);

return result;