2017-06-10 51 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(); 
} 
相关问题