2016-07-14 24 views
1

我必須確保只有特定的單元格存在於excel中,不會多於或少於此單元格。即使這些標題單元文本是預先指定的。即使不同的單元格文本也不能在應用程序中被允許。包含在C#中的字典中#

然後基於標題,我必須將數據放入列表中。

我在做我的Excel轉換成字典是這樣的:

var ws = excel.Workbook.Worksheets["Sheet1"]; 

int headerCol = 2; 

Dictionary<string, int> map = Enumerable 
    .Range(ws.Dimension.Start.Column, 24 - ws.Dimension.Start.Column + 1) 
    .ToDictionary(col => ws.Cells[headerCol, col].Value.ToString().Trim(), col => col); 

for (int rw = 3; rw <= ws.Dimension.End.Row; rw++) 
{ 
    if (!ws.Cells[rw, 1, rw, 24].All(c => c.Value == null)) 
    { 
     lgl.GroupMembershipUploadInputList.Add(new GroupMembershipUploadInput() 
     { 
      cnst_mstr_id = (ws.Cells[rw, map["Master Id"]].Value ?? (Object)"").ToString(), 
      cnst_prefix_nm = (ws.Cells[rw, map["Prefix"]].Value ?? (Object)"").ToString(), 

但現在我將如何確保字典圖只包含這些多指定的字符串鍵和沒有什麼比不同,例如主Id和前綴 - 只有這兩個,正是這兩個。

實際上有24個密鑰。是否有任何簡寫代碼要檢查?

+0

'map.Keys.All(k => new [] {「Master ID」,「Prefix」} .Contains(k));'? – itsme86

回答

3

Dictionary類包含一個名爲ContainsKey()方法可用於檢查字典中的一個關鍵是否存在等:

if(map.ContainsKey(key)) 
{ 
     // Do something 
} 

如果您需要檢查多重鍵的存在,你可以存儲你需要一個集合中的檢查,然後使用一點LINQ的按鍵對其進行評估:

// Keys to check for 
var keys = new []{ "Master_Id", "Prefix" }; 
// Check if all of these keys exist 
if(map.Keys.All(k => keys.Contains(k)) && map.Keys.Count() == keys.Count()) 
{ 
     // All of the keys are present in your collection 
} 

或者,你可以只通過Intersect()方法檢查按鍵的交集,並確保他們的匹配以及:

if(map.Keys.Intersect(keys).Count() == keys.Count()) 
{ 
     // Exactly every key is present 
} 
+0

您的LINQ查詢將檢查以確保所有密鑰均位於地圖中,但OP要確保只有那些密鑰位於地圖中。 – itsme86

+0

謝謝你指出。這是一個比任何錯誤更多的東西,但是會有很大的改變。 –

+1

爲什麼不添加條件(map.Keys.Count()== keys.Count())?與您的代碼聯合,它也將確保map.Keys –

1

基本上你希望兩個鍵集相等,所以你需要兩個檢查他們包含對方。

string[] keys = new[] { "Master Id", "Prefix" }; 
Dictionary<string, int> map = new Dictionary<string, int>(); 

bool check = keys.All(map.ContainsKey) && map.Keys.All(keys.Contains);