1

私は以下の辞書を持っています:

Dictionary<string, string> test = new Dictionary<string, string>();
test.Add("1|1", "blue");
test.Add("1|2", "Nice");
test.Add("1|3", "Jaish");
test.Add("2|2", "Muna");
test.Add("3|1", "haha");
test.Add("3|2", "green");
test.Add("4|1", "red");
Dictionary<string, string> test2 = new Dictionary<string, string>();
foreach (KeyValuePair<string, string> entry in test)
{
    if (!test2.ContainsValue(entry.Key))
        test2.Add(entry.Key, entry.Key);
}

以下の重複した値を削除したい:

test.Add("1|2", "Nice");
test.Add("1|3", "Jaish");
test.Add("3|2", "green")

したがって、重複を削除した後、Dictionaryのキー数は 4 になるはずです。

4

5 に答える 5

6

パイプ分割された文字列の最初の部分で重複が定義されていると仮定します。

var uniques = test.GroupBy(kv => kv.Key.Split('|')[0])
                  .Select(g => g.First())
                  .ToDictionary(kv => kv.Key, kv => kv.Value);

これにより、常に各グループの最初のキーと値のペアが選択されます。

于 2012-11-28T09:40:43.257 に答える
1

Implement IEqualityComparer<string> which will not allow you insert duplicate items

var test = new Dictionary<string, string>(new MyStringEqualityComparer());

...

public class MyStringEqualityComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        return x.Split('|')[0] == y.Split('|')[0];
    }

    public int GetHashCode(string obj)
    {
        return obj.Split('|')[0].GetHashCode();
    }
}
于 2012-11-28T09:44:00.473 に答える
0

あなたの例が不自然で、パイプで区切られたキーを使用したくないと仮定すると...

これを行う最も簡単な方法は、Dictionary.Add(..) を使用せず、代わりに値を設定することです。

test["1"] = "blue";
test["1"] = "NICE";
test["1"] = "Jaish";

Debug.Assert(test.Count == 1);

ただし、これが必要なロジックであるかどうか、毎回上書きするだけかどうかを判断する必要があります

于 2012-11-28T09:42:50.333 に答える
0

|の場合 は OR を意味し、このような新しい一意の辞書を作成できます。

var oredDict = new Dictionary<int, string>();
foreach (var kv in test.ToArray())
{
    var keys = kv.Key.Split('|').Select(int.Parse);
    oredDict[keys.First() | keys.Last()] = kv.Value;
}
于 2012-11-28T10:19:19.793 に答える
0

入力のキーの|記号は「または」を意味すると解釈されるべきだと思います。その場合は、最初にキーを分割して、キー部分ごとに新しいキーと値のペアを生成できます。

var test2 = test.SelectMany(kvp =>
    kvp.Key.Split('|').Select(k =>
        new KeyValuePair<string, string>(k, kvp.Value)));

...次に、新しいキーごとに最初の値のみを取得します。

var test3 = test2.GroupBy(kvp => kvp.Key)
                 .Select(g => g.First())
                 .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
于 2012-11-28T09:49:26.383 に答える