簡體   English   中英

刪除出現多次的數組元素

[英]Remove array elements that appear more than once

Array.Distinct()不同的元素。 如何從Array中刪除所有重復元素, 包括原始元素?

例如,給定此輸入數組:

{ Dog, Cat, Mouse, Dog, Dog, Parrot, Mouse, Hound }

我想得到以下輸出:

{ Cat, Parrot, Hound }

您可以使用一些Linq:

var singles = myArray
    .GroupBy(x => x)
    .Where(g => g.Count() == 1)
    .SelectMany(g => g);

或像這樣:

var singles = myArray
    .GroupBy(x => x)
    .Where(g => !g.Skip(1).Any())
    .SelectMany(g => g);
  • GroupBy方法將所有相似的元素收集在一起。
  • Where方法將篩選出不滿足特定條件的組。 我提供了兩個替代條件,但是它們都做同樣的事情-僅當組中僅包含一個元素時它們才返回true
    • g.Count() == 1計算每個組中的元素數量,如果結果等於1,則返回true
    • 如果在第一個之后沒有元素,則!g.Skip(1).Any()返回true 實際上,這實際上比g.Count() == 1效率更高,因為它不需要枚舉組中的所有元素,但是這對某些讀者來說有點令人困惑,因此在將其引入生產代碼之前請三思。
  • 最后, SelectMany將返回結果集合中的所有元素。 由於每個組中只有一個元素,因此只剩下那些沒有重復的元素。

您可以嘗試這樣的事情:

Array.GroupBy(x => x).Where(x => x.Count() == 1).SelectMany(x => x);
myList.Where(i => myList.Count(j => j == i) < 2);

請注意,這取決於==運算符是否足以進行比較(盡管您可以將其替換為所需的任何比較)。 它也不是很有效,盡管我懷疑其他任何答案都不會。

這通過將結果限制為在源列表中出現不超過一次的元素而起作用。

使用Group by子句可以得到結果。

var list = new List<string>  { "Dog", "Cat", "Mouse", "Dog", "Dog", "Parrot", "Mouse", "Hound" };


        //var list = new List<string> { "a", "b", "a", "c", "a", "b" };
        var q = (from x in list
                 group x by x into g
                 let count = g.Count()
                 where count == 1
                 orderby count descending
                 select g.Key); 
        foreach (var x in q)
        {
            Console.WriteLine(x);
        }
int []s={1,2,2,3,5,4,4};    

int[] q = s.Distinct().ToArray();

它將返回{1,2,3,5,4}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM