我有以下问题:我想从文本文件中读取工作人员数据,该文件已格式化; 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();
有什么问题?
答案 0 :(得分:1)
您获得空引用,因为x
为null
- 即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();