C# 删除多次出现的重复项
只是在linq上练习一下,我正在做通常的删除项目,这些项目只重复了一次以上,所以在下面的示例中,我有 单词1单词2单词1 它应该只打印出单词2,这里是一个简单的方法,可以更好地使用lambadaC# 删除多次出现的重复项,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
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