6

I have a dictionary of type Dictionary<string, IEnumerable<string>> and a list of string values. For some reason, every time I do an Add, every value in the dictionary is overwritten. I'm completely stumped as to why this is happening. I made sure it's not a reference problem be declaring and initializing the IEnumberable object within the loop so that it's scope does not go outside one iteration, and it still does it. Here is my code:

foreach (string type in typelist)
{
    IEnumerable<string> lst = 
        from row in root.Descendants()
        where row.Attribute("serial").Value.Substring(0, 3).Equals(type)
        select row.Attribute("serial").Value.Substring(3).ToLower();

    serialLists.Add(type, lst);
}

where typelist is an IEnumerable<string>, root is an XElement, and serialLists is my Dictionary.

4

2 に答える 2

10

これは、捕捉された反復子の問題です。

試す:

foreach (string tmp in typelist)
{
   string type = tmp;

(残りは変更なし)

または、追加中に式を評価します。つまり、.Add で .ToList() を実行します。

    serialLists.Add(type, lst.ToList());

2 番目のオプションは、他の方法では決して必要とされない可能性のあるものの評価を強制しますが、おそらく全体的により効果的です。

于 2012-04-23T17:07:17.713 に答える
6

その理由は、ループがすべての反復を完了したIEnumerable<string>、シーケンスが熱心に入力されているのではなく、オンデマンドで入力されているためです。したがって、任意のシーケンスが列挙されると、変数は常に の最後の要素の値を持ちます。foreachIEnumerable<string>typetypelist

これを修正する簡単な方法の 1 つを次に示します。

foreach (string type in typelist)
{
    string typeCaptured = type;

    IEnumerable<string> lst = 
        from row in root.Descendants()
        where row.Attribute("serial").Value.Substring(0, 3).Equals(typeCaptured)
        select row.Attribute("serial").Value.Substring(3).ToLower();

    serialLists.Add(typeCaptured, lst);
}
于 2012-04-23T17:08:12.800 に答える