2017-06-10 49 views
0

我有一個Dictionary<int, List<string>>enrolledStudents如何檢查字符串是否在列表中<string> in Dictionary <int,List <string>> in c#?

key是一個int,它是一個紙質代碼。 的value是一個字符串,其中字符串是學生的名單

我想知道什麼是我該如何檢查,看是否有string s是名單內的enrolledStudents

內部。例如

if(string s in List<string> of enrolledStudents){ 
    return enrolledStudent.key; 
} 
+0

如果你要查詢的學生姓名的字典,拿到試卷代碼,請嘗試使用字典其中關鍵是學生姓名和紙碼是值。然後你可以簡單地使用if(enrolledStudents.ContainsKey(studentName))return enrolledStudents [studentName]; – burkay

+0

但是如果每個學生都有多張紙,該怎麼辦?因爲他們將參加多個論文。 – Donald

+0

好點,所以你提到一個n對n的關係。看起來你需要做出設計決定。如果大部分查詢都是「誰加入了特定論文」,請按照以下方式使用@ M.kazem Akhgary的答案,如果大多數查詢將是「特定學生註冊的論文」,則使用在將值類型更改爲列表後進行。如果您經常進行這兩種查詢,則可以同時使用兩種字典來聲明兩個字典,但要注意數據的一致性。 – burkay

回答

0

解而不LINQ

// 1-ST溶液

Dictionary<int, List<string>> group = new Dictionary<int, List<string>>(); 
List<string> newList = new List<string> { "Orange", "Strawberry", "Banana"}; 
group.Add(1, newList); //Group of Fruits 

newList = new List<string> { "Hulk", "Spiderman", "Batman" }; 
group.Add(2, newList); //Group of Super-Heroes 

int GroupKey = 0; 
foreach(var groupItem in group) 
{ 
    foreach(var stringValue in groupItem.Value) 
    { 
     if(stringValue == "Spiderman") 
     { 
      GroupKey = groupItem.Key; 
      break; 
     } 
    } 
    if(GroupKey > 0) 
     break 
} 

//我認爲你應該在你的案例中使用第2種解決方案 (因爲對於每個學生只有一個鍵(數字)也許最好是使用字符串而不是列表,只有當你在使用學生的團體,你應該考慮1-ST溶液)

Dictionary<int, string> enrolledStudents = new Dictionary<int, string>(); 
enrolledStudents.Add(1, "Jamie Fox"); //Student 1 
enrolledStudents.Add(2, "Arnold Spenser"); //Student 2 
enrolledStudents.Add(3, "Jack & Jones"); //Student 3 

int StudentNumber = 0; 
foreach (var student in enrolledStudents) 
{ 
    if(student.Value == "Arnold Spenser") 
    { 
     StudentNumber = student.Key; 
     break; 
    } 
} 
0

使用LINQ

return enrolledStudents.FirstOrDefault(kvp => kvp.Value.Contains(s)).Key; 

注意,這個搜索是線性的。 正如評論中提到的,您可以重新創建另一個字典一次以優化搜索速度。

Dictionary<string, List<int>> pageMap = enrolledStudents 
        .SelectMany(kvp => 
         kvp.Value.Select(value => new { Key = value, Value = kvp.Key })) 
        .GroupBy(a => a.Key) 
        .ToDictionary(a => a.Key, a => a.Select(x => x.Value).ToList()); 

現在,您可以使用頁面地圖從學生這樣的頁面。

return pageMap[s]; 
+0

我可能會誤讀它,但是如果您正在展開列表,但嘗試使用相同的密鑰不會導致重複鍵出現問題嗎? – Chris

+0

第一部分似乎不是線性的。如果有n班和m班學生,在最壞的情況下,如查詢不存在的學生姓名,複雜程度將爲O(nm)。 – burkay

+0

它仍然是線性的。它不是指數。 @burkay –

0
Dictionary<int, List<string>> enrolledStudents = new Dictionary<int, List<string>>(); 
bool any = enrolledStudents.Any(x => x.Value.Contains("myString")); 

或者,如果你想第一個關鍵

var key = enrolledStudents.FirstOrDefault(kvp => kvp.Value.Contains(s))?.Key ?? ""; 

注意單個問號如果FirstOrDefault()返回一個空。

1

爲了讓所有的紙代碼爲特定的學生,你可以這樣做:

List<int> paperCodesForStudent = enrolledStudents 
    .Where(item => item.Value.Contains("studentName")) 
    .Select(item => item.Key) 
    .ToList(); 

你能做出這樣的方法,你也可以添加對名稱檢查不區分大小寫的比較:

private static List<int> GetPaperCodesForStudent(string studentName, 
    Dictionary<int, List<string>> enrolledStudents) 
{ 
    return enrolledStudents 
     .Where(item => item.Value.Any(name => 
      name.Equals(studentName, StringComparison.OrdinalIgnoreCase))) 
     .Select(item => item.Key) 
     .ToList(); 
} 
相關問題