如何索引C#Dictionary的Values属性

The*_*oot 2 c# dictionary

使用C#Dictionary的Values属性,

var  myDict =  Dictionary < string, object> ;
Run Code Online (Sandbox Code Playgroud)

我如何获得价值

  myDict.Values 
Run Code Online (Sandbox Code Playgroud)

我试过了

var theVales = myDict.Values ; 
object obj = theValues[0] ;
Run Code Online (Sandbox Code Playgroud)

但那是语法错误.

补充:我试图比较具有相同键的两个词典中的值

pho*_*oog 5

你不能.这些值没有固定的顺序.你可以将这些值写入一个新的List<object>并在那里将它们编入索引,但显然如果字典的内容经常更改,这并不是非常有用.

你也可以使用linq:myDict.Values.ElementAt(0)但是:

  • 随着字典的增长,元素将改变位置
  • 它的效率非常低,因为它只是foreach在给定的迭代次数上调用Values集合.

你也可以用SortedList<TKey, TValue>.这会根据键维护顺序,这可能是您想要的,也可能不是您想要的,它允许您按键或索引访问值.然而,在某些情况下它具有非常不幸的性能特征,所以要小心!

这是一个linq解决方案,用于确定匹配键的值是否也匹配.这仅适用于您为密钥类型使用默认的相等比较器.如果您正在使用自定义相等比较器,则可以使用方法调用语法执行此操作.

IEnumerable<bool> matches = 
    from pair1 in dict1
    join pair2 in dict2
        on pair1.Key equals pair2.Key
    select pair1.Value.Equals(pair2.Value)

bool allValuesMatch = matches.All();
Run Code Online (Sandbox Code Playgroud)

如果您要求一个字典中的所有项目都在另一个字典中具有匹配的项目,则可以执行以下操作:

bool allKeysMatch = new HashSet(dict1.Values).SetEquals(dict2.ValueS);
bool dictionariesMatch = allKeysMatch && allValuesMatch;
Run Code Online (Sandbox Code Playgroud)