並べ替え辞書にカスタムicomparerを使用する方法は?
-
01-10-2019 - |
質問
私のカスタム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つの電子メールアドレスを持つことができ、それらを単名で注文して、一緒に辞書にまだ存在することができます。
所属していません StackOverflow