2014-01-06 149 views
3

從數據表,我取的價值和投入Dictionary<string,string>C#如果鍵在字典中仍然添加值在字典

Dictionary<string, string> mydic= new Dictionary<string, string>(); 

我對前數據表是

Value  RowOrder  
page1  01 
page2  00 
page3  00 

我使用LINQ根據給定值獲取RowOrder並放入mydic

string id = (from DataRow dr in table3.Rows where (string)dr["Value"] == formula 
      select (string)dr["RowOrder"]).FirstOrDefault(); 
mydic.Add(id,Value); 

如果我運行此,錯誤顯示:

「具有相同密鑰的項目已被添加。」

如何克服這一點。我想page1page2page3應該與價值觀0100添加,添加

if (mydic.ContainsKey(id)) 
    mydic[id] = Value; // or throw exception   
else 
    mydic.Add(id, Value); 

順便說一句,如果你想你的DataTable轉換爲Dictionary<string, string>RowOrder像以前00分別

+0

字典不能有重複鍵,所以它是由你來決定在這種情況下會發生什麼。 – Rik

+3

這個問題沒有意義。字典的要點是能夠按鍵查找項目。如果您使用相同的密鑰添加多個項目,該如何工作?你期望看看你是否檢查了mydic [「00」]? – hvd

+1

如果你有重複的密鑰,那麼使用字典有什麼意義? – hmmftg

回答

7

您需要檢查字典是否已具有密鑰附加到它之前:

if(!mydic.ContainsKey(id)) 
{ 
    mydic.Add(id, Value); 
} 

字典不能包含具有相同鍵的兩個項目,如果您期望重複的id值,則需要考慮使用不同的數據結構。可能是List<Tuple<string, string>>

+0

謝謝我使用List > – user2380844

+0

@ user2380844沒問題,'List >'是個不錯的主意。 – DGibbs

3

檢查鍵是否存在鍵和第一個(或最後一個)作爲值,可以使用LINQ:

var mydic = table3.AsEnumerable() 
        .GroupBy(r => r.Field<string>("RowOrder")) 
        .Select(g => g.First()) // or last to use last value for key 
        .ToDictionary(r => r.Field<string>("RowOrder"), 
            r.Field<string>("Value")); 
+0

我知道GroupBy將返回一個IEnumerable >,是嗎?如果是這樣,我無法得到剩下的代碼在做什麼。請你解釋一下。 – mrida

+0

@mrida rest從每個組中選擇第一行,因此我們避免了重複密鑰問題。然後行的序列被轉換爲字典 –

1

可以使用單線方法Linq-To-DataSet使用GroupBy,在這裏:

Dictionary<string, string> mydic = table3.AsEnumerable() 
    .GroupBy(row => row.Field<string>("Value")) 
    .ToDictionary(grp => grp.Key, grp => grp.First().Field<string>("RowOrder")); 
1

使用

mydic[id] = Value; 

代替mydic.Add(); 如果要確保只有一個帶有給定鍵的項目被插入,則應使用Add方法。 請注意,這會覆蓋之前寫入的值。

如果你想有更多的項目使用相同的密鑰,你應該使用

Dictionary<string, IList<string>> 

或其他一些數據結構,我不知道,但我會很高興地聽到,因爲我用的那種字典不止一次

0

你可以使用一個Lookup<string,string>

List<Tuple<string, string>> tuples = new List<Tuple<string, string>>(); 
tuples.Add(new Tuple<string, string>("01", "page1")); 
tuples.Add(new Tuple<string, string>("00", "page2")); 
tuples.Add(new Tuple<string, string>("00", "page3")); 
var lookup = tuples.ToLookup(t => t.Item1,t=> t.Item2); 

而且你可以用它喜歡:

var result = lookup["00"]; 
foreach (var item in result) 
{ 
    Console.WriteLine(item); 
} 

,輸出:

page2 
page3