簡體   English   中英

檢查數組是否重復,僅返回出現多次的項目

[英]Check array for duplicates, return only items which appear more than once

我有一封電子郵件的文本文檔,例如

Google12@gmail.com,
MyUSERNAME@me.com,
ME@you.com,
ratonabat@co.co,
iamcool@asd.com,
ratonabat@co.co,

我需要檢查所述文檔是否重復,並從中創建一個唯一的數組(因此,如果“ ratonabat@co.co”在新數組中出現500次,他只會出現一次。)

編輯:例如:

username1@hotmail.com
username2@hotmail.com
username1@hotmail.com
username1@hotmail.com
username1@hotmail.com
username1@hotmail.com

這是我的“數據”(在數組或文本文檔中,我都可以處理)

我希望能夠查看其中是否有重復項,並將重復的ONCE移至另一個數組。 所以輸出將是

username1@hotmail.com

您可以簡單地使用Linq的Distinct擴展方法:

var input = new string[] { ... };
var output = input.Distinct().ToArray();

您可能還需要考慮將代碼重構為使用HashSet<string>而不是簡單的數組,因為它將優雅地處理重復項。


要獲得僅包含重復記錄的數組,這有點復雜,但是您仍然可以使用一點Linq來完成:

var output = input.GroupBy(x => x)
                  .Where(g => g.Skip(1).Any())
                  .Select(g => g.Key)
                  .ToArray();

說明:

  • .GroupBy相同的字符串分組在一起
  • .Where按以下條件過濾組
    • 如果組中有2個或更多項,則.Skip(1).Any()返回true。 這等效於.Count() > 1 ,但效率更高一些,因為它在找到第二個項目后停止計數。
  • .Select返回僅由單個字符串(而不是組)組成的集合
  • .ToArray將結果集轉換為數組。

這是使用自定義擴展方法的另一種解決方案:

public static class MyExtensions
{
    public static IEnumerable<T> Duplicates<T>(this IEnumerable<T> input)
    {
        var a = new HashSet<T>();
        var b = new HashSet<T>();
        foreach(var x in input)
        {
            if (!a.Add(x) && b.Add(x))
                yield return x;
        }
    }
}

然后您可以像下面這樣調用此方法:

var output = input.Duplicates().ToArray();

我沒有對此進行基准測試,但是它應該比以前的方法更有效。

您可以使用內置的.Distinct()方法,默​​認情況下,比較是區分大小寫的,如果要使其不區分大小寫,請使用帶比較器的重載,並使用不區分大小寫的字符串比較器。

List<string> emailAddresses = GetListOfEmailAddresses();
string[] uniqueEmailAddresses = emailAddresses.Distinct(StringComparer.OrdinalIgnoreCase).ToArray();

編輯:現在我看到您做出澄清后,您只想列出重復項。

string[] duplicateAddresses = emailAddresses.GroupBy(address => address,
                                                    (key, rows) => new {Key = key, Count = rows.Count()}, 
                                                    StringComparer.OrdinalIgnoreCase)
                                            .Where(row => row.Count > 1)
                                            .Select(row => row.Key)
                                            .ToArray();

選擇出現一次以上的電子郵件。

var dupEmails=from emails in File.ReadAllText(path).Split(',').GroupBy(x=>x)
              where emails.Count()>1
              select emails.Key;

暫無
暫無

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

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