如何索引C#字典的Values属性
使用C#Dictionary的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进行复印 通常,如果要对值进行迭代,则只能
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
}
}