c#中 如何用List<string>作为Dictionary的key。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#中 如何用List<string>作为Dictionary的key。相关的知识,希望对你有一定的参考价值。

(可以跳过此处看“@@ ”)由于两个方法(A、B)都需要一个字典作为参数,B方法需要用到A方法返回的字典作为参数,但是A、B两个方法的字典的关键字稍有区别:一个key是string,另一个key是一个数组string[])——就像分类的时候,A根据两个字段分类(那么他的key是string[]),B根据一个字段分类(他的key是string),这样如果在B方法中解析A返回的字典的话感觉有点麻烦,所以干脆用List<string>作为key,这样不论list里面可以存储任意多的字段——这样A返回的字典就可以直接当做B的参数了,B就可以直接去解析这个字典,从A返回的字典中的key中取得某一字段作为自己的key。

@@ 本以为天衣无缝,但是在构建List<string>的时候必须先实例化(new)他,然后将这个List<string>作为key存进字典,但是“new”之后,它的地址就变化了,虽然看上去值是一样的,但是当用ContainsKey去判断这个key是否存在的时候无论如何也判断不了!

@@ 请问各位你们有用过List作为key吗?如果碰到像我上面的情况(根据多个字段分类,然后一步步减少分类字段)你们是如何处理的?
可以定义一个类,然后扩展一个方法类似(equal),只是比较某个(些)属性值是否相同就判断其相等,而不是去判断存储的地址。
谢谢150316990 照你说的方法,还是没办法避免实例化啊(new)。还是得扩展方法是关键。

看你的文字直接晕了,List作为key存储进字典的情况确实少见,因为它是引用类型,也就是说你的字典的key是一个引用地址,每次new 这个List对象再做字典判断,那就没什么意义了,原因你自己也讲明白了:地址已经变化。
那么你最好改变一下思路,如果你不能把List<string>作为变量保存的话,那就不要用它做key了,你可以贴上自己的代码,帮看看你的设计思路,看能不能有别的途径解决。追问

代码太乱了,处理很多东西,就不贴了。
现在的做法是像150316990 说的用分割字符串,这样虽然不能保证百分之百的确保安全,但是自己定义了一个很难去重复的设置,就先这样吧,由于问题快到期了,先结贴了。
谢谢你们啦。

参考技术A bos.flush();
catch (Exception e)
e.printStackTrace();
finally
//关闭流
fw.close();
bw.close();
in.close();
bis.close();
out.close();
bos.close();

追问

这是?

本回答被提问者采纳
参考技术B 不懂了 我也学习下 参考技术C 你传进去的是引用

当然不会成功了追问

String也是引用类型啊!
是不是像这种情况就没办法用这种方式实现啊?
是的,String的时候如果是new出来的也应该不行,有没有什么办法,不用new呢?
可以在记录的时候缓存一份,判断的时候从缓存的里面去取。——也算是一种办法吧
谢谢。

追答

哪有用List作为key的

你非要这样用的话,用,分割的字符串吧

追问

我目前就是用的这种方法,但是不是很完美,因为 两对不同字段拼出来的字符串可能出现相同的,暂且这样吧。谢谢你。

追答

自定义一个类

把泛型作为一个成员封装进去

然后把这个类的对象作为key

以上是关于c#中 如何用List<string>作为Dictionary的key。的主要内容,如果未能解决你的问题,请参考以下文章

如何用struts 2.0标签 遍历 List<List<String>> listCollection?

如何用java创建一个用于构建广播变量spark的类标记?

C# 如何用 dateGridView 实现分页?

C# 如何为 List<T> 动态分配内存?

c# List<int[]> 如何转成 string?

JTree,如何用递归算法构建树