
class Person { public string name {get; set;} public int Age {get; set;} //...}Dictionary<string,Person> PersonProducerMethod() { Dictionary<string,Person> people = new Dictionary<string,Person>(); //somehow produce Person instances... people.add(myPerson.name,myPerson); //... return people;}voID PersonConsumerMethod(Dictionary<string,Person> people,List<string> names) { foreach(var name : names) { person = people[name]; //process person somehow... }} 然而,这看起来很笨拙,并且在Dictionary的键和它的值之间引入了相当松散的耦合;我隐含地依赖于Person字典的每个生成器,使用name属性作为存储每个Person的键.我不能保证人们[“Sax Russell”]的元素实际上是名字=“Sax Russell”的人,除非我每次访问字典时仔细检查.
有没有办法明确确保我的Person对象集合是通过名称索引,使用自定义相等比较器和/或liNQ查询?重要的是查找保持恒定时间,这就是为什么我不能只使用List.Find或Enumerable.Where.我已经尝试使用HashSet并使用相等比较器构建它,它只比较它给出的对象的name字段,但似乎没有任何方法可以使用它们的名称来检索Person对象.
解决方法 您可以构建由字典支持的自己的集合来完成此任务.我们的想法是存储一个带有Person的委托,并通过读取name属性返回一个字符串.这是一个这样的集合的骨架解决方案:
public class PropertyMap<K,V> : ICollection<V> { private Readonly IDictionary<K,V> dict = new Dictionary<K,V>(); private Readonly Func<V,K> key; public PropertyMap(Func<V,K> key) { this.key = key; } public voID Add(V v) { dict.Add(key(v)); } // Implement other methods of ICollection public this[K k] { get { return dict[k]; } set { dict[k] = value; } }} 以下是如何使用它:
PropertyMap<string,Person> mp = new PropertyMap<string,Person>( p => p.name);mp.Add(p1);mp.Add(p2);总结
以上是内存溢出为你收集整理的C#集合由属性索引?全部内容,希望文章能够帮你解决C#集合由属性索引?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)