0

我有一个程序可以解析两个文件(.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() 之类的东西?谢谢。

4

2 回答 2

9

是的,您可以执行以下操作:

var excelNames = new HashSet<string>(excelRecords.Select(x => x.Name));
var textRecordsNotInExcel = textRecords.Where(t => !excelNames.Contains(t.Name))
                                       .ToList();

顺便说一句,在这里创建支票的HashSet<string>目的是使Contains支票非常便宜。AList<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();
于 2013-06-29T16:15:59.780 回答
0

你是对的,你应该!Contains()喜欢这样:

var query= from ar in Textrecords
           let er=Excelrecords.Select(r=>r.Name)
           where !er.Contains(ar.Name)
           select ar;
于 2013-06-29T16:20:12.607 回答