删除dict中出现的列表中的元素

时间:2016-06-08 12:58:40

标签: c# linq list dictionary

大家好,我试过这样做:

public List<DirectoryInfo> RemoveDuplicates()
    {
      foreach (KeyValuePair<string, List<DirectoryInfo>> entry in b)
      {
        var wtf = a.RemoveAll(x => entry.Value.Contains(x) && x.Parent.Name == entry.Key);
      }

      return a;
    }

它应该是一个函数,告诉删除我的字典B中的DirectoryInfos原始列表中的重复项。我想通过比较列表A的名称和父名称与父(键)和列表我的词典中的子文件夹(值)。我的列表A实际上是DirectoryInfos的列表,但它的所有子文件夹,所以它记住它的名字,并知道它的父。对于dictionnary,我试图在for循环中要求删除出现在删除它的每个父名称。我尝试这样做并检查“wtf”的值,它表示为0.

修改

列出包含项目=&gt; 9.4.3.4(这是x或x.name),ACE(这是父名称的x.parent名称)

字典B =&gt;如果我进入调试

,则包含这个
[0] {[Name="IG"-Version="6_6", System.Collections.Generic.List`1[System.IO.DirectoryInfo]]} System.Collections.Generic.KeyValuePair<string,System.Collections.Generic.List<System.IO.DirectoryInfo>>

所以在[0] POSITION内部,键包含=

Key "Name=\"IG\"-Version=\"6_6\""   string

并且在值中我们有一个子文件夹列表,显示一个名称的样子。 +

[0] {6.6.1.107_8}   System.IO.DirectoryInfo

所以我试着看看是否有一个与列表中的父名称匹配的键,检查我们是否有任何相同的文件夹。删除它们

*********编辑2 *******

所以这将是我想要在字典b中出现的列表a中删除的一个例子。所以最初我们解析了这种格式的xml文件:

<Asset Name="SGL" Version="9.6">
      <TestCase Name="sst" Version="9.6.1.111" SubVersion=""/>
    </Asset>

然后我们将其存储在如此的字典中:

Key "Name=\"SGL\"-Version=\"9_6\""  string


[0] {9.6.1.111} System.IO.DirectoryInfo

我们试着在列表中比较a如果它包含相同的东西列表,如下所示:

9.6.1.111(它包含文件夹的名称)但它也知道它的父级(SLG_9_6)

1 个答案:

答案 0 :(得分:0)

你不应该遍历字典,这样做效率很低。您应该需要的就是:

var wtf = a.RemoveAll(x => b.ContainsKey(x.Parent.Name) && b[x.Parent.Name].Contains(x));

因此,您检查b是否包含Parent.Name,如果包含x,则检查该条目的列表是否包含Contains

话虽如此,我不确定您的原始代码是否应该无效 - 所以您的实际问题可能在其他地方。

您的问题可能实际上来自DirectoryInfo部分。由于Contains是一个类,它将为a执行引用相等。换句话说,只有在bvar wtf = a.RemoveAll(x => b.ContainsKey(x.Parent.Name) && b[x.Parent.Name].Any(y => y.FullName == x.FullName)); 中有指向同一个对象时,它才有效。如果它们不相同,那么您将不得不比较这些值。

类似的东西:

FullName

假设比较两个DirectoryInfo对象的Option<T>是你想要的