Dictionary 有一個ContainsKey方法,該方法的作用就是檢查鍵值對中是否存在該鍵。今天在使用時,遇到了點小麻煩:
Dictionary <List<int>,int> mydic=new Dictionary<List<int>,int>();
List<int> data = new List<int>();
data.Add(1);
data.Add(2);
data.Add(3);
mydic.Add(data,0);
//然后新建一個Lis<int> 用ContainsKey 檢查 用了兩種方法:
//方法一:
List<int> newData=https://bbs.csdn.net/topics/new List();
data.Foreach(x=>newData.Add(x));
if(mydic.ContainsKey(newData))
{
Console.Write("存在");
}
//方法二:
List<int> newData=https://bbs.csdn.net/topics/new List();
newData=https://bbs.csdn.net/topics/data;
if(mydic.ContainsKey(newData))
{
Console.Write("存在");
}
結論:
只有第二中方法 列印出了存在。
問題:
(1)ContainsKey 查找的本質是什么?
(2)第一種方法與第二種方法的區別在哪里?
(3) 第一種方法如何改進?
uj5u.com熱心網友回復:
你需要第一種方法是吧,寫一個自定義相等比較器就可以了。uj5u.com熱心網友回復:
不明白的地方是,第一種辦法錯在哪里?
uj5u.com熱心網友回復:
ContainsKey 其實就是判斷存在 key相等的元素, 最終都是進行key相等的判斷而你這里key是List<int>,這個判斷相等的依據是兩個List的參考是否一樣,而不是List里面的元素都相等
事實上用List<int>做key毫無意義也達不到預想的效果
uj5u.com熱心網友回復:
哦哦,我大概明白你的意思了。
你看這種方式:
Dictionary <int,int> mydic =new Dictionary<int,int>();
mydic.Add(1,5);
int value=https://bbs.csdn.net/topics/1;
if(mydic.ContainsKey(value))
{
Console.Write("存在,值為:{0}",mydic[value]);
}
else
{
Console.Write("不存在");
}
對上述例子自己的想法:
(1) 對于外界輸入的任意值value , 通過ContainsKey即可判斷出,該值存不存在于mydic 中,存在的話,就可獲得相對應的值。
(2) 上面這個例子,僅僅體現出了通過一個值找到另一個值,,有沒有就想我最上面的那個帖子一樣,通過兩個值,或者多個值,獲得相對應的值呢,,,所以自己斗膽試了試Dictionary<List<int>,int> ,然后發現這種方式 好像并不理想
uj5u.com熱心網友回復:
你可以從List<T>派生一個類,實作IEqualityComparer<T>介面然后實作Equals方法,在里面判斷兩個List的子元素是否完全相等
這個類就可以做為key來判斷了
uj5u.com熱心網友回復:
注意如果類名是 xxxx<T>,介面將要是 IEqualityComparer<xxxx<T>>uj5u.com熱心網友回復:
噢噢噢,蟹蟹
uj5u.com熱心網友回復:
(1)ContainsKey 查找的本質是什么?通過 key 判斷是否存在,如果存在你可以給你的 LIST 加資料。
(2)第一種方法與第二種方法的區別在哪里?
一個是查找,一個是賦值
(3) 第一種方法如何改進?
Dictionary <int,int> mydic =new Dictionary<int,int>();
mydic.Add(1,5);
int value=https://bbs.csdn.net/topics/1;
if(mydic.ContainsKey(value))
{
//如果存在可以
mydic[value]).Add(你的值);
}
else
{
//不存在
mydic[value]) = new List<int>(){ 你的值 };
}
uj5u.com熱心網友回復:
key 分為值型別和參考型別,值型別比較的是二者的值,參考型別比較的是二者的地址,即使參考型別內容完全相同但地址不同,那也是不同的 key(string 型別除外)。List<int>顯然是參考型別。uj5u.com熱心網友回復:
修正后的。System.Collections.Generic.Dictionary<int, System.Collections.Generic.List<int>> mydic = new System.Collections.Generic.Dictionary<int, System.Collections.Generic.List<int>>();
mydic.Add(1, new System.Collections.Generic.List<int>() { 你的值 });
int value = 1;
if (mydic.ContainsKey(value))
{
//如果存在可以
mydic[value].Add(你的值);
}
else
{
//不存在
mydic[value] = new System.Collections.Generic.List<int>() { 你的值 };
}
uj5u.com熱心網友回復:
看你的 KEY 最好用 簡單型別,如果用 LIST<int> 可以 去到他 TypeID 然后進行處理。uj5u.com熱心網友回復:
嗯嗯,我明白了,蟹蟹
uj5u.com熱心網友回復:
List<t> 是物件,兩個物件是不相等的。uj5u.com熱心網友回復:
寫一個只定義相等比較器,比較LIST<INT>的相等性uj5u.com熱心網友回復:
不特別指定的話,ContainsKey 方法使用默認的比較器,對于 List<T> 這種參考型別,比較的是參考是否相同。uj5u.com熱心網友回復:
Dim ss As String
ss = "123"
Dim a As New Dictionary(Of String, String)
a.Item(ss) = ""
Dim sss As String
sss = "123"
msgbox(a.ContainsKey(sss))
哪字串也是參考型別,為什么這個就回傳 true呢
uj5u.com熱心網友回復:
字串比較特殊,凡是內容完全相同的字串,在記憶體中只有一份,即上述中的 ss 和 sss 雖然是兩個變數,但內容完全相同,故二者參考了同一個地址。uj5u.com熱心網友回復:
兄弟,你可以試著分別改變方法一和方法二里面的newdata里面的值(增刪改都行),再去看看data里面的值變了沒有。結果是第一種不會變,第二種會跟著變化。
比較2個參考型別是否相等不是比較內容一致,而是比較參考地址呀。所以第一種newdata!=data,所以找不到
uj5u.com熱心網友回復:
先看看https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.generic.dictionary-2?view=netframework-4.8TKey是陣列,當然是參考型別,比較的是地址,而不是里面的值
uj5u.com熱心網友回復:
一個陣列做key?究竟是什么樣的需求啊uj5u.com熱心網友回復:
如果實在要用 List《int》做key的話建議新建一個型別,然后list《int》繼承之,然后將這個型別的gethashcode與equal方法重寫轉載請註明出處,本文鏈接:https://www.uj5u.com/net/130314.html
標籤:C#
上一篇:RDLC報表列印預覽不在紙的中心
