C# 删除多次出现的重复项

C# 删除多次出现的重复项,c#,list,linq,C#,List,Linq,只是在linq上练习一下,我正在做通常的删除项目,这些项目只重复了一次以上,所以在下面的示例中,我有 单词1单词2单词1 它应该只打印出单词2,这里是一个简单的方法,可以更好地使用lambada class Words { public string MyWords { get; set; } } public class Program { public static void Main() { List<Words> _words = new Lis

只是在linq上练习一下,我正在做通常的删除项目,这些项目只重复了一次以上,所以在下面的示例中,我有

单词1单词2单词1

它应该只打印出单词2,这里是一个简单的方法,可以更好地使用lambada

class Words {
    public string MyWords { get; set; }
}

public class Program    
{
    public static void Main()
{
  List<Words> _words = new List<Words>();
  _words.Add(new Words() { MyWords = "word1" });
  _words.Add(new Words() { MyWords = "word2" });
  _words.Add(new Words() { MyWords = "word1" });

   RemoveDuplicatesLinq(_words);
}   
    static void RemoveDuplicatesLinq(List<Words> _words) {
        List<Words> duplicatesRemoved = new List<Words>();
        duplicatesRemoved = _words.GroupBy(x => x)
                    .Where(group => group.Count() > 1)
                    .Select(group => group.Key).ToList();  
        foreach (var item in duplicatesRemoved) {
            Console.Write("Words Left " + item.MyWords + "\r\n");
        }
    }       
}
类词{
公共字符串MyWords{get;set;}
}
公共课程
{
公共静态void Main()
{
列表_words=新列表();
_添加(新单词(){MyWords=“word1”});
_添加(新单词(){MyWords=“word2”});
_添加(新单词(){MyWords=“word1”});
删除的副本(大写);
}   
静态无效已删除副本LNQ(列表字){
List duplicatesRemoved=新列表();
duplicatesRemoved=\u words.GroupBy(x=>x)
.Where(group=>group.Count()>1)
.Select(group=>group.Key).ToList();
foreach(重复项中的var项已删除){
Console.Write(“Words Left”+item.MyWords+“\r\n”);
}
}       
}

它应该只打印出一个出现的单词2,但不是

你应该只按
MyWords
分组,只过滤长度为1的组。然后,您可以使用将组展平为
IEnumerable
。由于您似乎想要一个列表,我们可以添加
ToList()
将结果转换为
list


您应该只按
MyWords
分组,并且只过滤长度为1的组。然后,您可以使用将组展平为
IEnumerable
。由于您似乎想要一个列表,我们可以添加
ToList()
将结果转换为
list


这里可能的选项是将
MyWords
属性包装为匿名类型(它们通过属性值进行比较,而不是通过引用等式进行比较),然后选择计数等于
1

var duplicatesRemoved=\u words.GroupBy(x=>new{x.MyWords})
.Where(group=>group.Count()==1)
.Select(group=>group.Key).ToList();
foreach(重复项中的var项已删除)
{
Console.Write(“Words Left”+item.MyWords+“\r\n”);
}
在您的代码
group.Count()>1
中,条件意味着选择具有重复项的组,但实际上您需要相反的条件

另一个选项是按
MyWords
属性对源列表进行分组,获取计数为1的组,然后从这些组中选择第一项(因为
Where
子句之后每个组中只有一项)

var duplicatesRemoved=\u words.GroupBy(x=>x.MyWords)
.Where(group=>group.Count()==1)
.Select(group=>group.First())
.ToList();

此处可能的选项是将
MyWords
属性包装为匿名类型(它们通过属性值进行比较,而不是通过引用等式进行比较),然后选择计数等于
1的组

var duplicatesRemoved=\u words.GroupBy(x=>new{x.MyWords})
.Where(group=>group.Count()==1)
.Select(group=>group.Key).ToList();
foreach(重复项中的var项已删除)
{
Console.Write(“Words Left”+item.MyWords+“\r\n”);
}
在您的代码
group.Count()>1
中,条件意味着选择具有重复项的组,但实际上您需要相反的条件

另一个选项是按
MyWords
属性对源列表进行分组,获取计数为1的组,然后从这些组中选择第一项(因为
Where
子句之后每个组中只有一项)

var duplicatesRemoved=\u words.GroupBy(x=>x.MyWords)
.Where(group=>group.Count()==1)
.Select(group=>group.First())
.ToList();

您应该重写
Words
中的
Equals
GetHashCode
方法class@PavelAnikhouski当然,他们的方法比重写方法更简单?你应该重写
单词中的
Equals
GetHashCode
方法class@PavelAnikhouski当然是他们的使用一种比重写方法更简单的方法来做这件事吗?他们的方法是一种不用重写的方法吗linq@rogue39nin管理循环并遍历源集合或使用哈希集。然而,linq解决方案似乎是一种最简单的解决方案,这是一种不用linq@rogue39nin管理循环并遍历源集合或使用哈希集。然而,linq解决方案在这里似乎是最简单的
List<Words> duplicatesRemoved = _words
            .GroupBy(x => x.MyWords)
            .Where(group => group.Count() == 1)
            .SelectMany(group => group)
            .ToList();

foreach (var item in duplicatesRemoved)
{
    Console.Write("Words Left " + item.MyWords + "\r\n");
}
Words Left word2