我有一个解析两个文件(.txt和.xls)的程序,将各种不同的字段存储到对象中
List<AcsRecord> Textrecords = AcsFileParser.Parsefile(path1);
List<ExcelRecord> Execelrecords = excelFileParser.Parsefile(path2);
作为一个例子,AcsRecord是:
public string EID {get; set;}
public string Name {get; set;}
Excel记录具有类似的名称记录。我想在主要发现AcsRecord中找到的所有在Excelrecord中找不到的名称。使用linq join,我只能找到相同的。我不确定如何仅引用每条记录中的名称字段。也许像!contains()? 感谢。
答案 0 :(得分:9)
是的,您可以执行以下操作:
var excelNames = new HashSet<string>(excelRecords.Select(x => x.Name));
var textRecordsNotInExcel = textRecords.Where(t => !excelNames.Contains(t.Name))
.ToList();
此处创建HashSet<string>
的目的是让Contains
检查非常便宜。 List<string>
也会起作用(例如var excelNames = excelRecords.Select(x => x.Name).ToList();
)但是它会涉及对每个文本记录的所有Excel记录名称进行O(N)检查。
编辑:如果你只想要文本记录的名称不在Excel中,那就容易多了:
var missingNames = textRecords.Select(t => t.Name)
.Except(excelRecords.Select(e => e.Name))
.ToList();
答案 1 :(得分:0)
你是对的,你应该!Contains()
这样:
var query= from ar in Textrecords
let er=Excelrecords.Select(r=>r.Name)
where !er.Contains(ar.Name)
select ar;