使用lambdas按属性排序而不创建类

时间:2016-04-01 09:53:10

标签: c# lambda

我有以下问题:我想从文本文件中读取工作人员数据,该文件已格式化; worker_id;name;surname;login;。然后将其写入另一个只包含没有重复登录行的文件。

当我创建class worker , List<workers>并尝试此代码时:

List<worker> unics = workers
           .GroupBy(w => w.login)
           .Select(g => g.First())
           .ToList();

string login = line1.Split(';')[3];,一切正常。

但是当我使用Lambdas而不创建类工作者时(目前对我来说这不是必需的),它不起作用。

List<string> unicsL = list1            //list1 - list of all lines1 in file      
           .GroupBy(x => x.Split(';')[3])  //ERROR - NullReferenceException // - Use new keyword to create object instance...
           .Select(g => g.First())         
           .ToList();

有什么问题?

2 个答案:

答案 0 :(得分:1)

您获得空引用,因为xnull - 即list1中的某个条目为null

您可以在制作小组前检查此内容:

        List<string> unicsLx = list  
           .Where(x=> x != null)
           .GroupBy(x => x.Split(';')[3])
           .Select(g => g.First())         
           .ToList();

更好的选择是使用IsNullOrWhiteSpace()

        List<string> unicsLx = list  
           .Where(x=> !string.IsNullOrWhiteSpace(x))
           .GroupBy(x => x.Split(';')[3])
           .Select(g => g.First())         
           .ToList();

但是,如果没有3x ;(或者最后一个为空),您很快就会遇到另一个问题,所以您也可以添加该检查:

        .Where(x => !string.IsNullOrWhiteSpace(x) && x.Split(';').Length > 2 && !string.IsNullOrWhiteSpace(x.Split(';')[3]))

但是,这意味着您多次应用Split(在群组中反复播放两次),因此您可以通过添加Select来删除其中一个:

    // Example data
    var list = new[] { "a;b;c;d", null, "w;x;y;z;", "m;m;m;d", "", "one;two", "empty;empty;empty;" };

    List<string> unicsL = list
        .Where(x => !string.IsNullOrWhiteSpace(x) && x.Split(';').Length > 2)
        .Select(x => x.Split(';')[3])
        .Where(x => !string.IsNullOrWhiteSpace(x))
        .GroupBy(x => x)
        .Select(g => g.First())
        .ToList();

答案 1 :(得分:0)

使用此功能。

List<string> unicsL = list1            //list1 - list of all lines1 in file      
           .Where(x=>!string.IsNullOrEmpty(x))
           .GroupBy(x => new {key = x.Split(';')[3]})  
           .Select(g => g.First())         
           .ToList();