0

私は2つの辞書を持っています

1つはネストされた辞書です -

Dictionary<string, List<string>> Dict = new Dictionary<string, List<string>>();

そしてもう一つは通常のものです -

Dictionary<string, string> ObjDict = new Dictionary<string, string>();

通常の辞書では、このような値があります

{[DateTime_7_25_2013_12_26_11_PM_Table_2_1_Trade_2_1.xml, 0000000047510D9744C9A54EB11C0]} {[DateTime_7_25_2013_12_26_11_PM_Table_2_1_Trade_2_2.xml, 0000000047510D9744C9A54EB11C0]} {[DateTime_7_25_2013_12_26_11_PM_Table_2_2_Trade_3_1.xml, 0000000047510D9744C9A54EB11C1]} {[DateTime_7_25_2013_12_26_11_PM_Table_2_2_Trade_3_2.xml, 0000000047510D9744C9A54EB11C1]} {[DateTime_7_25_2013_12_26_11_PM_Table_2_2_Trade_3_3.xml, 0000000047510D9744C9A54EB11C2]}

今、私はこのようなネストされた辞書が欲しいです –

“Key0”  DateTime_7_25_2013_12_26_11_PM_Table_2_1_Trade_2_1.xml
        DateTime_7_25_2013_12_26_11_PM_Table_2_1_Trade_2_2.xml

“Key1”  DateTime_7_25_2013_12_26_11_PM_Table_2_2_Trade_3_1.xml
        DateTime_7_25_2013_12_26_11_PM_Table_2_2_Trade_3_2.xml

“Key2”  DateTime_7_25_2013_12_26_11_PM_Table_2_2_Trade_3_3.xml

通常の辞書の等しい値のすべてのキーは、ネストされた辞書の 1 つのキーに属する必要があります。

提案してください。

4

5 に答える 5

1
ObjDict.GroupBy(kvp => kvp.Value).ToDictionary(g => g.Key, g => g.Select(kvp => kvp.Key).ToList())
于 2013-07-25T07:57:58.973 に答える
1

わかりました、質問を正しく理解していれば:

ディクショナリ内の値でアイテムをグループ化し、各キーが元のディクショナリの値の 1 つである新しいディクショナリに配置する入力ディクショナリがある場合、各値はそのキーのリストです。価値:

var items = new Dictionary<string, string>
{
    {"C03", "C"},
    {"B01", "B"},
    {"A01", "A"},
    {"C02", "C"},
    {"A03", "A"},
    {"B03", "B"},
    {"B02", "B"},
    {"A02", "A"},
    {"C01", "C"}
};

var result = items.GroupBy(item => item.Value)
            .ToDictionary
            (
                g => g.Key, 
                g => g.Select(x => x.Key).ToList()
            );

foreach (var item in result)
{
    Console.Write("Values for key " + item.Key + ": ");

    foreach (var value in item.Value)
        Console.Write(value + " ");

    Console.WriteLine();
}

上記のコードは、次の出力を生成します。

Values for key C: C03 C02 C01
Values for key B: B01 B03 B02
Values for key A: A01 A03 A02

ご覧のとおり、この出力は順序付けされていません (入力と同じ順序です)。

ディクショナリのキーと各リストの値の両方を並べ替えたい場合は、次のようにできます。

var result = items.GroupBy(item => item.Value)
            .OrderBy(item => item.Key)
            .ToDictionary
            (
                g => g.Key, 
                g => g.Select(x => x.Key).OrderBy(x => x).ToList()
            );

この変更により、次の出力が生成されます。

Values for key A: A01 A02 A03
Values for key B: B01 B02 B03
Values for key C: C01 C02 C03
于 2013-07-25T07:59:41.147 に答える
0

少しの疑似コードなので、自分でいくつかの作業を行うことができます:P

ステップ1:

 make a hashTable or something which stores your ObjDict.Values and your Dict.Keys

( "0000000047510D9744C9A54EB11C0" -> "Key0" )

ステップ2:

for each  ObjDict.Key
  if(Dict.contains(HashTable[thisKey])
   Take List from Dict and add the ObjDict.Value
  else
   Make new list, add ObjDict.Value
   Dict.Add(HashTable[thiskey], theList
于 2013-07-25T08:22:08.537 に答える
0

Multipledictionary で独自の Dictionary、MultiDictionary を作成し、値を追加するときにキーとリストを使用してプライベート ディクショナリを維持し、キーが既に存在するかどうかを確認し、存在する場合はリストに追加して、ジェネリックにすることができます。

public class MultipleDictionary<TKey, TValue>
{
    private IDictionary<TKey, IList<TValue>> _dict;

    public bool ContainsKey(TKey key)
    {
        return _dict.ContainsKey(key);
    }

    public TValue this[TKey key]
    {
        get 
        {
            if (_dict.ContainsKey(key))
                return _dict[key][0];

            return default(TValue);
        }
        set
        {
            if (_dict.ContainsKey(key))
            {
                IList<TValue> valList = _dict[key];
                valList.Add(value);
            }
            else
            {
                IList<TValue> list = new List<TValue>();
                list.Add(value);
                _dict.Add(key, list);
            }
        }
    }
}

これがアイデアです。残りは自分で実装してみてください

于 2013-07-25T07:55:31.307 に答える
0

あなたはそれを使うことができます:

  foreach (var item in ObjDict)
  {
    if (Dict.ContainsKey(item.Value))
    {
      var e = Dict[item.Value];
      e.Add(item.Key);
    }
    else
    {
      Dict.Add(item.Value, new List<string>() { item.Key });
    }
  }
于 2013-07-25T07:52:07.793 に答える