我正在阅读C#6.0中介绍的最新功能,并且只是按照自动属性初始化程序的示例,
class NewSample
{
    public Guid Id { get; } = Guid.NewGuid();
}
但我的IDE无法识别语法.
我想知道如何在Visual Studio 2013中启用C#6.0.我使用的Target框架是4.5.1.
我有一个类(SomeClass),其中包含一个属性Name的string类型.我需要存储该类的数组并按名称查找其项目.为此目的,有两种类型的集合:KeyedCollection和Dictionary.我的问题是:它们之间有什么区别,在这种情况下最好使用KeyedCollection和Dictionary?感谢您提供任何解释帮助.
I'm looking for something like a Dictionary<K,V> however with a guarantee that it preserves insertion order. Since Dictionary is a hashtable, I do not think it does.
Is there a generic collection for this, or do I need to use one of the old .NET 1.1 collections?
为什么没有OrderedDictionary的通用实现?
在发布此消息之前,我确实看到: 没有OrderedDictionary的通用实现?
但这只是证实它不存在.不是为什么它不存在.
我见过一些自定义实现,包括:http: //www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx
但是为什么微软不把它包含在基础.net库中呢?当然他们有理由不建造通用......但它是什么?
谢谢
编辑:Perhpase应该转移到programmers.se.com ...但我不知道如何移动它.
我用a Dictionary<string, Item>来存储自己的物品.
使用字典的原因是密钥是唯一的,访问速度很快.  
在大多数情况下,我只使用dicionary来访问单个项目.但在一个案例中,我必须遍历字典 - 在这里我需要按顺序添加项目.
我只知道字典在内部使用哈希表,但我不知道它是如何组织的.
问题:
 
字典中的项目是否已添加?
添加或删除项目时,订单会发生什么变化?
Invoke-Command我在脚本块采用字典类型参数的地方运行时遇到错误:
无法处理参数“字典”的参数转换。无法将“System.Collections.Hashtable”类型的“System.Collections.Hashtable”值转换为“System.Collections.Generic.IDictionary`2[System.String,System.String]”类型。在行:7 字符:1 + Invoke-Command -ComputerName 。-ArgumentList $dictionary -ScriptBlock ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidData: (:) [], ParameterBindin...mationException + FullQualifiedErrorId : ParameterArgumentTransformationError + PS计算机名称:本地主机
经过大量挖掘后,我能够将脚本简化为下面的 MVP,以显示此问题的根源:
[System.Collections.Generic.IDictionary[string, string]]$dictionary = New-Object -TypeName 'System.Collections.Generic.Dictionary[string, string]' 
$dictionary.Add('one', 'hello')
$dictionary.Add('two', 'world')
Write-Verbose "Main Script $($dictionary.GetType().FullName)" -Verbose #outputs: VERBOSE: Before System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
Invoke-Command -ComputerName . -ArgumentList $dictionary -ScriptBlock {
    Param (
        #[System.Collections.Generic.IDictionary[string, string]] #if I leave this in I get a conversion error
        $dictionary
    ) …比如,如果我创建这样的字典:
Dictionary<string, MyClass> dic = new Dictionary<string, MyClass>();
dic.add("z1", val1);
dic.add("abc9", val2);
dic.add("abc8", val3);
dic.add("ABC1", val4);
所以当我这样做时:
foreach (KeyValuePair<string, MyClass> kvp in dic)
{
}
我保证将这些值检索为:"z1","abc9","abc8","ABC1"?
如果我第一次这样做,它会是:"z1","abc8","ABC1"?
dic.Remove("abc9");
我想在字典中保存一些对.
最后,我想将字典序列化为JSON对象.然后我打印JSON内容.我希望这些对的打印顺序与它们在字典中输入的顺序相同.
起初我用了一本普通的字典.但后来我觉得订单可能没有保留.然后我迁移到OrderedDictionary,但它不使用Generic,这意味着它不是类型安全的.
你有其他任何好的练习解决方案吗?
与此相关:
System.OutOfMemoryException因为大字典
OutOfMemoryException当我让.NET管理我的字典时,我得到了.调整大小方法抛出的异常.所以我试图通过提供大量的容量来避免调整大小.当然,我试图从int.MaxValue确保它将有助于解决问题开始.我计划尽可能多地下降.
然而OutOfMemoryException被扔了int.MaxValue.我决定进行一些二进制搜索,并将构造函数接受的容量的第一个值转换为int.MaxValue / 32.这不仅比我预期的要小,而且还令人困惑.
那么有谁有任何想法为什么?
哦,项目设置设置为使用x64架构.
如果目标是创建一个保留插入顺序的通用只读字典,那么SortedList <,>或SortedDictionary <,>是否可以与IComparer <>一起使用,它试图通过执行类似下面的操作来维护插入顺序?
class OrderedComparer<T> : IComparer<M>
{
    public int Compare(M x, M y)
    {
        return x.Equals(y) ? 0 : -1;//or 1
    }
}
SortedList<M> orderedList = new SortedList<M>(new OrderedComparer<T>());
(有趣的是,在SortedDictionary的情况下,上述方法需要返回0或1以防止元素按反向插入顺序排序).
我有一个Dictionary<string, Func<string, string>>.我使用键来提供下拉项,允许用户选择要运行的算法.然后我可以方便地将所选值反馈到字典中以获得相关功能.
// Initialization
my_dict["Function #1"] = func1;
my_dict["Function #2"] = func2;
...
// Executing
result = my_dict[user_choice](input);
现在,当填充下拉列表时(a System.Windows.Forms.ComboBox)我循环使用这个键foreach.MSDN警告说,System.Collections.Generic.Dictionary不能保证有稳定的订单.但实际上我知道订单非常稳定,所以它现在有效.我确实希望为用户很好地订购这些功能.
但是,我想要正确地做到这一点 - 即.通过使用保证订单稳定性的数据结构.不幸的OrderedDictionary是没有用,因为它强迫值为objects; 我想让他们成为职能代表.与此同时,我不想添加太多不必要的复杂性(例如,我可以将密钥的副本存储为List<string>用于订单,但这似乎是一个糟糕的解决方案).
我能做什么?
注意:看起来有些人认为我希望我的项目按字母顺序排列.我不.我希望它们保持与我添加它们的顺序相同.也就是说,如果Function #2之前添加了密钥Function #1,它将按顺序出现在它之前.
c# ×10
dictionary ×7
.net ×5
hashtable ×2
.net-3.5 ×1
c#-6.0 ×1
powershell ×1
psobject ×1
sortedlist ×1