【问题标题】:LINQ: Compare two lists and count subsetLINQ:比较两个列表并计算子集
【发布时间】:2015-02-03 14:17:19
【问题描述】:

我正在比较 2 个列表,并且仅当发现多个列表时,我才需要从主列表 (allModules) 中收集出现的子集 (modulesToDelete)。 (allModules 包含 modulesToDelete)。 modulesToDelete 中任何模块的多次出现意味着这些模块正在被共享。在 modulesToDelete 中出现一个模块意味着该模块是隔离的并且可以安全删除(它刚刚找到自己)。我可以使用嵌套的 foreach 循环来做到这一点,但这是我使用 LINQ 表达式(不起作用)收集的情况:

List<Module> modulesToDelete = { A, B, C, K }
List<string> allModules = {R, A, B, C, K, D, G, T, B, K }  // need to flag B and K

var mods = from mod in modulesToDelete
where allModules.Any(name => name.Contains(mod.Name) && mod.Name.Count() > 1)
select mod;

这是我想用 LINQ 表达式替换的嵌套 foreach 循环:

foreach (Module mod in modulesToDelete)
{
    int count = 0;
    foreach (string modInAllMods in allModules)
    {
        if (modInAllMods == mod.Name)
        {
            count++;
        }
    }

    if (count > 1)
    {
        m_moduleMarkedForKeep.Add(mod);
    }
    else if( count == 1)
    {
        // Delete the linked modules
    }
}

【问题讨论】:

    标签: c# linq collections compare subset


    【解决方案1】:

    您可以使用类似于字典但允许多个相等键并返回 IEnumerable&lt;T&gt; 作为值的查找。

    var nameLookup = modulesToDelete.ToLookup(m => m.Name);
    var safeToDelete = modulesToDelete.Where(m => nameLookup[m.Name].Count() == 1);
    var sharedModules = modulesToDelete.Where(m => nameLookup[m.Name].Count() > 1);
    

    编辑:但是,我根本看不出allModules 是如何相关的。

    可能更容易并在您的示例数据上获得所需的结果:

    var mods = modulesToDelete.Where(m => allModules.Count(s => s == m.Name) > 1);
    

    【讨论】:

    • 谢谢!这让我朝着正确的方向前进。我添加了更多示例数据并尝试了以下操作: ... safeToDelete = allModules.Where(m => m....);
    • @TanHur:看看我添加的更简单的方法。
    • 我尝试了一些变化,但我总是得到这个:mods = { A, B, C, K, B, K } 我需要这个:mods = {B, K}
    • 我不明白为什么,因为我已经用您的样本数据对其进行了测试,而第二种方法返回了这两个对象。
    【解决方案2】:

    解决这个问题的一种方法是使用 Intersect 函数, Intersection of two string array (ignore case)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多