如何索引C#字典的Values属性

如何索引C#字典的Values属性,c#,dictionary,C#,Dictionary,使用C#Dictionary的Values属性 var myDict = Dictionary < string, object> ; 我试过了 var theVales = myDict.Values ; object obj = theValues[0] ; 但这是一个语法错误 增加: 我试图比较两本字典中的值 相同的键好吧,如果你真的需要,你可以使用,但你不应该期望顺序是稳定的或有意义的。或者,拨打ToArray或ToList进行复印 通常,如果要对值进行迭代,则只能

使用C#Dictionary的Values属性

var  myDict =  Dictionary < string, object> ;
我试过了

var theVales = myDict.Values ; 
object obj = theValues[0] ;
但这是一个语法错误

增加:
我试图比较两本字典中的值 相同的键

好吧,如果你真的需要,你可以使用,但你不应该期望顺序是稳定的或有意义的。或者,拨打
ToArray
ToList
进行复印

通常,如果要对值进行迭代,则只能使用
值。你到底想在这里干什么?您是否了解
词典中条目的顺序未定义

编辑:听起来你想要的是:

var equal = dict1.Count == dict2.Count &&
            dict1.Keys.All(key => ValuesEqual(key, dict1, dict2));

...
private static bool ValuesEqual<TKey, TValue>(TKey key,
    IDictionary<TKey, TValue> dict1,
    IDictionary<TKey, TValue> dict2)
{
    TValue value1, value2;
    return dict1.TryGetValue(out value1) && dict2.TryGetValue(out value2) &&
           EqualityComparer<TValue>.Default.Equals(value1, value2);
}
var equal=dict1.Count==dict2.Count&&
dict1.Keys.All(key=>ValuesEqual(key,dict1,dict2));
...
专用静态布尔值sequal(TKey,
词典词典1,
词典词典(2)
{
t值1、值2;
返回dict1.TryGetValue(输出值1)和&dict2.TryGetValue(输出值2)&&
EqualityComparer.Default.Equals(值1,值2);
}
编辑:请注意,这并没有可能的那么快,因为它在两个字典上都执行查找。这将更有效率,但不那么优雅:

var equal = dict1.Count == dict2.Count &&
            dict1.All(pair  => ValuesEqual(pair.Key, pair.Value, dict2));

...
private static bool ValuesEqual<TKey, TValue>(TKey key, TValue value1,
    IDictionary<TKey, TValue> dict2)
{
    TValue value2;
    return dict2.TryGetValue(out value2) &&
           EqualityComparer<TValue>.Default.Equals(value1, value2);
}
var equal=dict1.Count==dict2.Count&&
dict1.All(pair=>ValuesEqual(pair.Key,pair.Value,dict2));
...
专用静态布尔值sequal(TKey-key,TValue-value1,
词典词典(2)
{
t值2;
返回dict2.TryGetValue(输出值2)&&
EqualityComparer.Default.Equals(值1,值2);
}

你不能。这些值没有固定的顺序。您可以将这些值写入一个新的
列表
,并在那里建立索引,但如果字典的内容经常更改,显然这并没有多大帮助

您还可以使用linq:
myDict.Values.ElementAt(0)
但是:

  • 随着字典的增长,元素的位置将发生变化
  • 它的效率非常低,因为它只是针对给定的迭代次数调用Values集合上的
    foreach
您也可以使用
SortedList
。它根据键按顺序维护值,键可能是您想要的,也可能不是您想要的,它允许您通过键或索引访问值。但是,在某些场景中,它具有非常不幸的性能特征,因此要小心

下面是一个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();

为了补充@JonSkeet的答案,
字典
由哈希表支持,哈希表是一种无序的数据结构。因此,这些值的索引是毫无意义的——比如说,通过一次调用获得A,B,C
,通过下一次调用获得A,B,A
,这是完全有效的

编辑:


根据您对JS答案的评论(“我试图用相同的键比较两个字典中的值”),您希望这样:

public boolean DictionariesContainSameKeysAndValues<TKey, TValue>(Dictionary<TKey, TValue> dict1, Dictionary<TKey, TValue> dict2) {
    if (dict1.Count != dict2.Count) return false;
    for (var key1 in dict1.Keys)
        if (!dict2.ContainsKey(key1) || !dict2[key1].Equals(dict1[key1]))
            return false;
    return true;
}
公共布尔字典包含SameKeysandValues(字典目录1、字典目录2){
如果(dict1.Count!=dict2.Count)返回false;
for(dict1.Keys中的var key1)
如果(!dict2.ContainsKey(key1)| |!dict2[key1]。等于(dict1[key1]))
返回false;
返回true;
}

您可以使用索引器属性来查找字符串键。 它仍然不是索引,而是另一种方式:

using System.Collections.Generic;
...
class Client
{
   private Dictionary<string, yourObject> yourDict 
      = new Dictionary<string, yourObject>();

   public void Add (string id, yourObject value)
      { yourDict.Add (id, value); }

   public string this [string id]      // indexer
   {
   get { return yourDict[id]; }
   set { yourDict[id] = value; }
   }
}

public class Test
{
   public static void Main( )
   {
      Client client = new Client();
      client.Add("A1",new yourObject() { Name = "Bla",...);
      Console.WriteLine ("Your result: " + client["A1"]); // indexer access
    }   
}
使用System.Collections.Generic;
...
类客户端
{
私人词典
=新字典();
public void Add(字符串id、对象值)
{yourDict.Add(id,value);}
公共字符串this[string id]//索引器
{
获取{return yourDict[id];}
设置{yourDict[id]=value;}
}
}
公开课考试
{
公共静态void Main()
{
客户端=新客户端();
Add(“A1”,newyourObject(){Name=“Bla”,…);
Console.WriteLine(“您的结果:+client[“A1”]);//索引器访问
}   
}

我正试图比较两个具有相同键的字典中的值,但听起来我应该遍历字典?@TheMoot:您当然不应该依赖排序,不。将进行编辑。您可以通过调用
dict1.All(pair=>ValuesEqual(pair,dict2))来提高性能
并相应地修改
ValuesEqual
。@phoog:是的,我想知道。我更喜欢这一款的外观,但我同意它更贵。我会在有时间时添加注释。附加的链接可能也会有帮助:
public boolean DictionariesContainSameKeysAndValues<TKey, TValue>(Dictionary<TKey, TValue> dict1, Dictionary<TKey, TValue> dict2) {
    if (dict1.Count != dict2.Count) return false;
    for (var key1 in dict1.Keys)
        if (!dict2.ContainsKey(key1) || !dict2[key1].Equals(dict1[key1]))
            return false;
    return true;
}
using System.Collections.Generic;
...
class Client
{
   private Dictionary<string, yourObject> yourDict 
      = new Dictionary<string, yourObject>();

   public void Add (string id, yourObject value)
      { yourDict.Add (id, value); }

   public string this [string id]      // indexer
   {
   get { return yourDict[id]; }
   set { yourDict[id] = value; }
   }
}

public class Test
{
   public static void Main( )
   {
      Client client = new Client();
      client.Add("A1",new yourObject() { Name = "Bla",...);
      Console.WriteLine ("Your result: " + client["A1"]); // indexer access
    }   
}