Jor*_*ijk 0 c# dictionary list
我创建了一个方法,Dictionary<string, List<Employee>>在这个方法中返回一个循环遍历a List<Employee>并查找firstname并将其按字母顺序添加到我的Dictionary中
请看以下示例:
其中第一部分是姓氏,第二部分是名字
我的方法创建了一个像这样的字典
方法:
public async Task<Dictionary<string, List<Employee>>> GetAllOrderdedByNameAsync()
{
var dbList = await _employeeRepository.ListAsync();
var employees = dbList.Select(FromDb).ToList();
var empDict = new Dictionary<string, List<Employee>>();
for (char c = 'A'; c <= 'Z'; c++)
{
var list = employees.Where(employee => employee.LastName.StartsWith(c.ToString(), StringComparison.CurrentCultureIgnoreCase)).ToList();
if (list.Count > 0)
{
empDict.Add(c.ToString(), list);
}
}
return empDict;
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题......有更好的方法吗?我将保持List<Employee>输入并需要Dictionary<string,List<Employee>>输出,所以请不要说我需要返回其他内容.
听起来你真的想要ILookup<string, Employee>一个字典,其中每个键映射到潜在的多个值.是的,你可以创建一个,Dictionary<string, List<Employee>>但我强烈建议你不要.你说你"需要" Dictionary<string,List<Employee>>- 为什么?
查找代码将是:
var lookup = list.ToLookup(x => x.Substring(x.LastName(0, 1)),
StringComparer.CurrentCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)
为了得到一本字典,如果你真的有一个很好的理由,你可以使用:
var dictionary = list.GroupBy(x => x.Substring(x.LastName(0, 1)))
.ToDictionary(g => g.Key, g => g.ToList(),
StringComparer.CurrentCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)
...但正如我所说,我强烈建议使用一种已经代表您正在寻找的类型,以更简洁的方式.(它还有一个很好的功能,允许你通过任何键查找,如果没有条目,只返回一个空序列.)
您可能还想考虑使用char您的键而不是string,因为您只处理单个字符 - 并且还要考虑您希望发生在姓氏上的内容,例如"de Havilland"或以重音字符开头的名字.(换句话说,您可能希望执行一些规范化.)