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

C#,两个对象列表查找两个对象中一个变量之间的差异,c#,linq,list,object,difference,C#,Linq,List,Object,Difference,我有一个程序可以解析两个文件(.txt和.xls),将不同的字段存储到对象中 List<AcsRecord> Textrecords = AcsFileParser.Parsefile(path1); List<ExcelRecord> Execelrecords = excelFileParser.Parsefile(path2); Excel记录具有类似的名称记录。我主要想找到在AcsRecord中找到的、在Excelrecord中找不到的所有名称。使用linq j

我有一个程序可以解析两个文件(.txt和.xls),将不同的字段存储到对象中

List<AcsRecord> Textrecords = AcsFileParser.Parsefile(path1);
List<ExcelRecord> Execelrecords = excelFileParser.Parsefile(path2);
Excel记录具有类似的名称记录。我主要想找到在AcsRecord中找到的、在Excelrecord中找不到的所有名称。使用linq join,我只能找到那些相等的。我不确定如何仅引用每个记录中的名称字段。也许是这样!包含()?
谢谢。

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

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

你是对的,你应该
!包含()
如下所示:

var query= from ar in Textrecords
           let er=Excelrecords.Select(r=>r.Name)
           where !er.Contains(ar.Name)
           select ar;

令人惊叹的我可以将这个变量放入foreach循环中,将它们打印到控制台上,对吗?@jonskeet-一旦你有了HashSet,使用
Except()
?@Hogan-HashSet没有
Except
方法(你可以使用
IEnumerable.Except
这是O(n)),虽然它有
ExceptWith
,但这也是O(n)。HashSet.Contains是O(1),所以在大多数情况下,我相信使用
HashSet.Contains
会更有效。当我尝试使用foreach打印时,它会多次显示“myclass.AcsRecord”,而不是值(名称)。这是为什么?@Cassus使用此
foreach(textRecordsNotInExcel中的项){print item.Name;}
var missingNames = textRecords.Select(t => t.Name)
                              .Except(excelRecords.Select(e => e.Name))
                              .ToList();
var query= from ar in Textrecords
           let er=Excelrecords.Select(r=>r.Name)
           where !er.Contains(ar.Name)
           select ar;