将名称列表转换为字典,其中每个条目对应于以某个字母开头的名称

Jor*_*ijk 0 c# dictionary list

我创建了一个方法,Dictionary<string, List<Employee>>在这个方法中返回一个循环遍历a List<Employee>并查找firstname并将其按字母顺序添加到我的Dictionary中

请看以下示例:

  • 雇员
    • Eijk,Jordy
    • 大卫,约翰
    • 能,简,简
    • 等等

其中第一部分是姓氏,第二部分是名字

我的方法创建了一个像这样的字典

  • "D",列表({Doe,John},{Doe,Jane})
  • "E",List({Eijk,Jordy})

方法:

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>>输出,所以请不要说我需要返回其他内容.

Jon*_*eet 8

听起来你真的想要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"或以重音字符开头的名字.(换句话说,您可能希望执行一些规范化.)

  • @ sa_ddam213:那么`First`将返回一个`char`而不是`string` ....你也可以在那一点使用`[0]`. (2认同)