【问题标题】:C#, Two lists of object find differences between one variable in both objectsC#,两个对象列表查找两个对象中一个变量之间的差异
【发布时间】:2013-06-27 06:11:56
【问题描述】:

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

【问题讨论】:

    标签: c# linq list object difference


    【解决方案1】:

    是的,你可以这样做:

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

    顺便说一句,在这里创建HashSet&lt;string&gt; 的目的是使Contains 支票非常便宜。 List&lt;string&gt; 也可以工作(例如var excelNames = excelRecords.Select(x =&gt; x.Name).ToList();),但它需要对每个文本记录的所有 Excel 记录名称进行 O(N) 检查。

    编辑:如果您只希望文本记录的 名称 不在 Excel 中,那就容易多了:

    var missingNames = textRecords.Select(t => t.Name)
                                  .Except(excelRecords.Select(e => e.Name))
                                  .ToList();
    

    【讨论】:

    • 太棒了。我可以将此 var 放入 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(item in textRecordsNotInExcel) { print item.Name; }
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-04
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      相关资源
      最近更新 更多