使用.Net中的Dictionary 进行线程安全

我有这个function: static Dictionary KeyValueDictionary = new Dictionary(); static void IncreaseValue(int keyId, int adjustment) { if (!KeyValueDictionary.ContainsKey(keyId)) { KeyValueDictionary.Add(keyId, 0); } KeyValueDictionary[keyId] += adjustment; } 我原本认为这不是线程安全的。 但是,到目前为止,在测试它时,我没有看到同时从多个线程调用它时的任何exception。 我的问题:它是线程安全还是我到目前为止幸运? 如果它是线程安全的那么为什么?

将INotifyPropertyChanged添加到模型?

我在我的wpf MVVM(基于Prism的)应用程序中遇到了一些设计问题,很乐意得到你的建议。 我的模型非常简单: public class Customer { public string FirstName {get;set;} public string LastName {get;set;} } 如您所见,我的Model类没有任何INotifyPropertyChnaged支持。 我还在CustomerDetails屏幕上有ViewModel,它支持INotifyPropertyChanged。 public class CustomerDetailsViewModel:INotifyPropertyChanged /*Or NotificationObject*/ { /*INotifyPropertyChanged event */ private Customer item; public Customer Item { get{return item;} set { item=value; //Raise PropertyChanged //Set IsDirty to true } } } 在我看来,我正在使用绑定到Item.FirstName和我正在更新的ViewModel。 我的问题是 – 因为只有FirstName属性通过View更新,而Model本身不支持INotifyPropertyChanged,因此Item setter没有被调用,并且IsDirty仍然等于false(因此不会更新IsDirty通知)用户界面)。 我知道我可以在模型中支持INotifyPropertyChanged,然后在视图模型中注册到Item.PropertyChanged事件,并实际将IsDirty设置为true,但是 – […]

搜索范围列表中数字的最快方法

我有以下代码来查找范围列表中的数字匹配。 public class RangeGroup { public uint RangeGroupId { get; set; } public uint Low { get; set; } public uint High { get; set; } // More properties related with the range here } public class RangeGroupFinder { private static readonly List RangeGroups=new List(); static RangeGroupFinder() { // Populating the list items here RangeGroups.Add(new […]

在.NET 4.5中使用HttpClient进行编码

我正在使用fogbugz XML API消耗一些数据。 此API始终以UTF-8提供数据。 当使用WebClient类发出请求时,我可以设置编码。 例如: var result = new WebClient(); result.Encoding = Encoding.UTF8; 但是HttpClient类怎么样? HttpClient client = new HttpClient(); 我应该使用: client.GetByteArrayAsync(url); …然后将编码中的字节(UTF-8)转换为字符串? 或者有没有办法直接将内容作为UTF-8字符串? using (var client = Connector.GetHttpClient()) { var byteData = await client.GetByteArrayAsync(url); data = Encoding.UTF8.GetString(byteData); } 最后,这里是XML响应的摘录:

使用ToDictionary构建排序字典

我不是C#和LINQ的专家。 我有一个Dictionary ,我理解一个哈希表,也就是说,键没有排序。 dataBase = new Dictionary() Record是一个用户定义的类,它包含给定键字符串的大量数据。 我发现了一个有趣的例子,它通过LINQ将这个Dictionary转换为一个排序的字典: var sortedDict = (from entry in dataBase orderby entry.Key ascending select entry) .ToDictionary(pair => pair.Key, pair => pair.Value); 此代码正常工作。 生成的sortedDict按键排序。 问题 :我发现sortedDict仍然是一个哈希表,类型为: System.Collections.Generic.Dictionary 我期望得到的字典应该是C ++ STL中的一种map ,它通常被实现为(平衡的)二叉树以维持密钥的排序。 但是,生成的字典仍然是哈希表。 sortedDict如何维护排序? 哈希表不能保存键的顺序。 C#的Generic.Dictionary的实现是否只是典型的哈希表?

获取ComboBox的先前值

我希望我的应用程序获取ComboBox的值,然后设置用户选择的值或以某种方式获取先前选择的值。 问题是在我的表单中,有四个列表和一个ComboBox(包含列表中的所有值),我想将ComboBox的值重新填充回它的列表,然后删除新选择的项目来自其他/相同的名单。

尝试调用有效方法重载时出现奇怪的“程序集未引用”错误

我在Assembly A使用方法重载: public static int GetPersonId(EntityDataContext context, string name) { var id = from … in context… where … select …; return id.First(); } public static int GetPersonId(SqlConnection connection, string name) { using (var context = new EntityDataContext(connection, false)) { return GetPersonId(context, name); } } 当我尝试从Assembly B调用第二个重载时,VS会产生以下编译时错误: “System.Data.Entity.DbContext”类型在未引用的程序集中定义。 您必须添加对程序集’EntityFramework,Version = 6.0.0.0,Culture = neutral,PublicKeyToken = …’的引用。 […]

WCF OperationContract – 我应该公开哪种通用集合类型?

我有一个WCF Web服务,它有一个返回generics集合的方法。 现在,我的问题是:我应该将它暴露为ICollection , List , IList , IEnumerable还是其他什么? 我想List是不可能的 ,因为我想避免CA1002错误 ,但底层类型将是List 。 我真的很想听听你对此的看法,最好能够很好地解释你为何如何思考自己的想法。 提前致谢

切换案例,检查C#3.5中的范围

在C#中, switch语句不允许case跨越值范围。 我不喜欢为此目的使用if-else循环的想法,所以有没有其他方法来检查C#中的数值范围?

如何在WPF DataGrid中处理组小计和目标行?

我正在实现一个包含许多关键值的项目的WPF DataGrid。 项目按项目类别分组。 对于每个类别,应该有: 在每个关键值列中显示该行的所有行的总和的行。 绑定到的数据源网格中不属于目标行的目标行。 目标行告诉每一列当年的目标是什么(例如,要花多少钱)。 这些行应始终位于每个组的顶部(排序过滤)。 我的第一个解决方案是将这些数据放在组头中。 这不是一个好的解决方案,因为组头不支持列。 即它应该通过获得列宽来构造。 这可以做到,但是当用户想要重新排序和隐藏列时,它会变得复杂。 DataGrid使用的是CollectionViewSource,因此它没有填充C#代码。 基本上我正在扩展这个例子: http : //msdn.microsoft.com/en-us/library/ff407126.aspx 谢谢和最诚挚的问候 – matti