-3

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

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 循环中从索引器中检索值,那么它将返回集合中的

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

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

4

2 回答 2

1

如果我们查看 C# 源代码,我们可以看到为什么会这样:

索引器

/// <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 变量访问的内容)返回该索引处的值。

枚举器

/// <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.

于 2015-12-19T17:04:17.447 回答
1

名称值集合

表示可以使用键或索引访问的关联字符串键和字符串值的集合。

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

在第二个中,您正在通过索引访问值

于 2015-12-19T17:04:41.300 回答