比较两个重复列表

时间:2020-08-28 14:45:06

标签: c# linq

我有两个列表:

    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 €", UserName, LegalCompany, SalesAuthorities)

但是如何与SalesAuthorityListFromFiles中的值进行比较?

1 个答案:

答案 0 :(得分:6)

Contains更改为Any,然后可以在比较之前格式化每个元组:

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

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

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

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

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