3

(listElement) のような要素を含むリストがあります: {e1,e2,e3,e4,e5,e6,e7}

リストのリスト (listOfList) のようなグループです: { {e1,e2,e3,e4}, {e1,e2,e3}, {e2,e3,e4}, {e1,e2}, {e2, e3}, {e3,e4}, {e5}, {e6,e7} }

私が欲しいのは、そのリストを辞書に入れることです>> (dict) そのように:

  • キー、(値)
  • e1, ({e1,e2,e3,e4},{e1,e2,e3},{e1,e2})
  • e2, ({e1,e2,e3,e4},{e1,e2,e3},{e2,e3,e4},{e1,e2},{e2,e3})
  • e3, ({e1,e2,e3,e4},{e1,e2,e3},{e2,e3,e4},{e2,e3},{e3,e4})
  • e4, (({e1,e2,e3,e4},{e2,e3,e4},{e3,e4})
  • e5, ({e5}) = e6, ({e6,e7})

今のところ私はそのようなコードを持っています:

foreach (element in listElement){
   var elementListOfList = listOfList,where(e=>e.countain(f));
   dict[f.id] = elementListOfList;
}

問題は、ディクショナリのビルドが非常に長すぎることです。これは、ディクショナリに 100 万個の要素があるためです。

for each よりも for を使用するのが最善であることはわかっていますが、他のこともできると確信しています。

私の質問は、誰かが辞書の作成を最適化するアイデアを持っていること、および/またはコードの最適化に役立つサイトや本を持っていることです。

4

2 に答える 2

1

Well, you cannot do it any faster than to iterate over all your elements in all your lists, since you cannot predict which list contains which items.

But you could optimize your code a bit:

Say you have your list of lists:

List<List<E>> listOfList = new List<List<E>>()
{
    new List<E>() { e1, e2, e3, e4 },
    new List<E>() { e1, e2, e3 },
    ... 
};

Then, you could make a dictionary:

Dictionary<E, List<List<E>>> dic = new Dictionary<E, List<List<E>>>();

And here you go:

foreach (List<E> list in listOfList)
{
    foreach (E item in list)
    {
        List<List<E>> itemList;

        if (!dic.TryGetValue(item, out itemList))
        {
            dic[item] = itemList = new List<List<E>>();
        }

        itemList.Add(list);
    }
}
于 2013-10-13T13:15:07.300 に答える