[英]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
按以下條件過濾組
.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.