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)。还是得扩展方法是关键。
最新回答
凉月流沐

2024-11-07 09:54:07

看你的文字直接晕了,List作为key存储进字典的情况确实少见,因为它是引用类型,也就是说你的字典的key是一个引用地址,每次new 这个List对象再做字典判断,那就没什么意义了,原因你自己也讲明白了:地址已经变化。
那么你最好改变一下思路,如果你不能把List<string>作为变量保存的话,那就不要用它做key了,你可以贴上自己的代码,帮看看你的设计思路,看能不能有别的途径解决。
追问
代码太乱了,处理很多东西,就不贴了。
现在的做法是像150316990 说的用分割字符串,这样虽然不能保证百分之百的确保安全,但是自己定义了一个很难去重复的设置,就先这样吧,由于问题快到期了,先结贴了。
谢谢你们啦。
著名奶茶鉴定家

2024-11-07 15:51:49

bos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭流
fw.close();
bw.close();
in.close();
bis.close();
out.close();
bos.close();
}
}
追问
这是?
无人懂我

2024-11-07 04:21:23

不懂了 我也学习下
爷是那么黑

2024-11-07 16:21:22

你传进去的是引用

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

你非要这样用的话,用,分割的字符串吧
追问
我目前就是用的这种方法,但是不是很完美,因为 两对不同字段拼出来的字符串可能出现相同的,暂且这样吧。谢谢你。
追答
自定义一个类

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

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