1

次のような電子メールのテキスト文書があります

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

上記のドキュメントの重複をチェックし、そこから一意の配列を作成する必要があります (したがって、新しい配列に「ratonabat@co.co」が 500 回表示される場合、彼は 1 回だけ表示されます)。

編集:例:

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

これは私の「データ」です(配列またはテキストドキュメントのいずれかで、処理できます)

その中に重複があるかどうかを確認し、重複した ONCE を別の配列に移動できるようにしたいと考えています。したがって、出力は次のようになります

username1@hotmail.com
4

3 に答える 3

10

Linq のDistinct拡張メソッドを簡単に使用できます。

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

HashSet<string>単純な配列の代わりに aを使用するようにコードをリファクタリングすることを検討することもできます。これは重複を適切に処理するためです。


重複しているレコードのみを含む配列を取得するには、少し複雑ですが、少しの Linq を使用して行うことができます。

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

説明:

  • .GroupBy同じ文字列をグループ化する
  • .Where次の基準でグループをフィルタリングします
    • .Skip(1).Any()グループに 2 つ以上のアイテムがある場合は true を返します。これは と同等です.Count() > 1が、2 番目のアイテムを見つけた後にカウントを停止するため、わずかに効率的です。
  • .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();

これをベンチマークしたことはありませんが、以前の方法よりも効率的であるはずです。

于 2013-11-08T05:34:33.893 に答える
3

組み込み.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();
于 2013-11-08T05:36:39.223 に答える
1

複数回発生するメールを選択するには..

var dupEmails=from emails in File.ReadAllText(path).Split(',').GroupBy(x=>x)
              where emails.Count()>1
              select emails.Key;
于 2013-11-08T05:35:29.963 に答える