C#,两个对象列表找到两个对象中一个变量之间的差异

时间:2013-06-29 16:13:40

标签: c# linq list object difference

我有一个解析两个文件(.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()? 感谢。

2 个答案:

答案 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;