質問

私のカスタムicomparerをsortdictionary <>に使用するのが困難です。目標は、電子メールアドレスを特定の形式(firstnam.lastname@domain.com)にキーとして配置し、姓でソートすることです。私がこのようなことをするとき:

public class Program
{
  public static void Main(string[] args)
  {
    SortedDictionary<string, string> list = new SortedDictionary<string, string>(new SortEmailComparer());
    list.Add("a.johansson@domain.com", "value1");
    list.Add("b.johansson@domain.com", "value2");
    foreach (KeyValuePair<string, string> kvp in list)
    {
      Console.WriteLine(kvp.Key);
    }
    Console.ReadLine();
  }
}

public class SortEmailComparer : IComparer<string>
{
  public int Compare(string x, string y)
  {
    Regex regex = new Regex("\\b\\w*@\\b",
                        RegexOptions.IgnoreCase
                        | RegexOptions.CultureInvariant
                        | RegexOptions.IgnorePatternWhitespace
                        | RegexOptions.Compiled
                        );

    string xLastname = regex.Match(x).ToString().Trim('@');
    string yLastname = regex.Match(y).ToString().Trim('@');
    return xLastname.CompareTo(yLastname);
  }
}

私はこのargumentExceptionを取得します:An entry with the same key already exists. 2番目のアイテムを追加するとき。

私は以前にsortdictionaryのカスタムIcomparerと仕事をしたことがありませんが、自分のエラーがわかりません。何が間違っていますか?

役に立ちましたか?

解決

2つのラストネームが等しい場合は、たとえば、次のようなメール全体を比較してください。

int comp = xLastname.CompareTo(yLastname);
if (comp == 0)
   return x.CompareTo(y);
return comp;

実際、ソートディクショナリの比較はキー*を区別するためにも使用されるため、完全な比較を指定する必要があります(並べ替え戦略だけでなく)

編集: * sortdictionaryでは、比較が0になると2つのキーが等しいことを意味します

他のヒント

まあ、私はあなたの比較を分解していません - しかし、それは姓で比較しているように見えます、そしてあなたは同じ姓(ヨハンソン)を2回追加しようとしています。それか したほうがいい あなたに与えます ArgumentException.

あなたが何をしたか 欲しいです 起こる - そしてあなたは何をしますか 欲しいです あなたの比較はしますか?

おそらく、姓で並べ替えたいのでしょう そして、最初の名前?そうすれば、同じ姓と異なる名の2つの電子メールアドレスを持つことができ、それらを単名で注文して、一緒に辞書にまだ存在することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top