为什么 "foreach" 循环 returns 键而 "indexer" returns 来自 NameValueCollection 的值

Why "foreach" loop returns Key while "indexer" returns Value from a NameValueCollection

我有一个包含多个项目的 NameValueCollection。当我尝试从该集合中检索值时,它 returns 我从集合

中获取 Key
NameValueCollection col= new NameValueCollection();
    col.Add("Item1", "Foo");
    col.Add("Item2", "Bar");
    col.Add("Item3", "Pooh");
    col.Add("Item4", "Car");
    foreach (string val in col) 
    {
       if (val == "Item3") //val contains the Key from the collection
          { break; }
    }

而另一方面,如果我尝试在 for 循环中从索引器中检索值,那么它 returns 我是集合 [=] 中的 Value 16=]

for (int i = 0; i < col.Count; i++) 
{
    string val = col[i];
    if (val == "Pooh") //val contains the 'Value' from the NameValueCollection
    {
       break;
    }
}

为什么这些不同类型的循环有不同类型的结果?

如果我们查看 C# 源代码,就会明白为什么会发生这种情况:

Indexer

/// <devdoc>
/// <para>Represents the entry at the specified index of the <see cref='System.Collections.Specialized.NameValueCollection'/>.</para>
/// </devdoc>
public String this[int index] {
    get 
    {
        return Get(index);
    }
}

索引器,您在循环中使用 i 变量访问的内容,returns 该索引处的值。

Enumerator

/// <devdoc>
/// <para>Returns an enumerator that can iterate through the <see cref='System.Collections.Specialized.NameObjectCollectionBase'/>.</para>
/// </devdoc>
public virtual IEnumerator GetEnumerator() {
    return new NameObjectKeysEnumerator(this);
}

枚举器,使用 foreach 语句时得到的,为您提供 NameValueCollection.

的键列表

NameValueCollection

Represents a collection of associated String keys and String values that can be accessed either with the key or with the index.

ForEach 访问字符串键
col[val] 将通过键

访问值

第二个你通过索引访问值