[英]Removing duplicates that appear more than once
只是在 linq 上練習了一下,我正在做通常的刪除項目,這些項目只會重復多次,所以在下面的例子中我有。
字 1 字 2 字 1
它應該只打印出單詞 2 Here is a https://dotnetfiddle.net/P47DGT是他們用 lambda 更好地做到這一點的簡單方法。
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");
}
}
}
它應該只打印出一次出現的 Word2 但它不是
您應該只按MyWords
並僅過濾長度為 1 的組。然后您可以使用System.Linq.Enumerable.SelectMany
將組展平為IEnumerable<Words>
。 由於您似乎想要一個列表,我們可以添加ToList()
將結果轉換為List<Words>
。
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
此處可能的選項可以是將MyWords
屬性包裝成匿名類型(它們通過屬性值進行比較,而不是通過引用相等),然后 select 組計數等於1
var duplicatesRemoved = _words.GroupBy(x => new { x.MyWords })
.Where(group => group.Count() == 1)
.Select(group => group.Key).ToList();
foreach (var item in duplicatesRemoved)
{
Console.Write("Words Left " + item.MyWords + "\r\n");
}
在您的代碼 group.Count group.Count() > 1
條件中,意味着 select 組具有重復項,但實際上您需要相反。
另一種選擇是通過MyWords
屬性對源列表進行分組,獲取計數等於 1 的組,然后 select 這些組中的第一項(因為在Where
子句之后每個組中只有一個項)
var duplicatesRemoved = _words.GroupBy(x => x.MyWords)
.Where(group => group.Count() == 1)
.Select(group => group.First())
.ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.