首页 > 解决方案 > 比较两个列表的重复项

问题描述

我有两个清单:

    public static List<string> SalesAuthorityListFromFiles = new List<string>();

    public static List<(string UserName, string LegalCompany, string SalesAuthorities)> ListOfSalesAuthorities = new List<(string UserName, string LegalCompany, string SalesAuthorities)>();

我正在尝试建立一个新列表以获取“已删除的销售机构”:

var SalesAuthorityThatNotMatch = SalesAuthorityListFromFiles.Where(x => !ListOfSalesAuthorities.Contains(x)).ToList();

我收到一个错误x,我明白为什么,但我不确定如何解决它:

严重性代码描述项目文件行抑制状态错误 CS1503 参数 1:无法从“字符串”转换为“(字符串用户名,字符串 LegalCompany,字符串 SalesAuthorities)”

我需要加入string UserName, string LegalCompany, string SalesAuthorities一个字符串才能与SalesAuthorityListFromFiles值进行比较:

string.Format(@"{0} / {1} : {2}.00 €&quot;, UserName, LegalCompany, SalesAuthorities)

但是我怎样才能对中的值进行比较SalesAuthorityListFromFiles

标签: c#linq

解决方案


更改ContainsAny然后您可以在比较之前格式化每个元组:

var salesAuthorityThatNotMatch = SalesAuthorityListFromFiles
    .Where(x => !ListOfSalesAuthorities
        .Any(y => $"{y.UserName} / {y.LegalCompany} : {y.SalesAuthorities}.00 €&quot; == x))
    .ToList();

您也可以创建一个HashSet<string>格式化元组,这将使用更多内存,但会提高 LINQ 查询的效率:

var salesAuthoritiesFormatted = ListOfSalesAuthorities
    .Select(y => $"{y.UserName} / {y.LegalCompany} : {y.SalesAuthorities}.00 €&quot;)
    .ToHashSet();

然后HashSet<string>.Contains将以O(1)时间复杂度工作:

var salesAuthorityThatNotMatch = SalesAuthorityListFromFiles
    .Where(x => !salesAuthoritiesFormatted.Contains(x))
    .ToList();

推荐阅读