LINQ:比较两个列表并计算子集



我正在比较 2 个列表,只有当找到多个出现时,我才需要从主列表 (allModules) 中收集子集 (modulesToDelete) 的出现次数。(allModules 包含 modulesToDelete)。模块ToDelete中任何模块多次出现意味着正在共享这些模块。模块ToDelete中出现一次意味着该模块是隔离的,可以安全删除(它刚刚找到自己)。我可以使用嵌套的 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;

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

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
    }
}
您可以使用类似于

字典的查找,但允许多个相等键并返回IEnumerable<T>作为值。

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);

解决这个问题的一种方法是使用相交函数,两个字符串数组的交集(忽略大小写)

相关内容

  • 没有找到相关文章

最新更新