2016-06-08 167 views
0

大家好我试着这样做:删除元素

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

这应该是告诉删除我原来DirectoryInfos是在我的字典B.我想要的清单副本功能通过比较列表A的名称和父母名称与我的字典中的父(键)和子文件夹(值)列表来完成此操作。我的列表A实际上是DirectoryInfos的一个列表,但它的所有子文件夹,所以它记住它的名字并知道它的父母。对于词典,我试图在for循环中删除出现在删除它的每个父名称。我想这样做的,检查的“跆拳道”的价值和它说0

编辑

列表中包含的项目=> 9.4.3.4(这是x或x.name),ACE (这是x.parent名父名的一个例子)

Dictionnary B =>包含此完全相同,如果我在调试去

[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]位置的内部的密钥包含=

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

并在值我们有一个子文件夹列表生病显示如何一个名字的样子。 +

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

所以我试着去看看有没有,如果我们有任何内部相同的文件夹与父名称匹配器列表中检查的关键。删除它们

********* EDIT 2 *******

因此,这将是我想要出现在字典中B文件清单一去除的东西的例子。所以最初我们解析这个格式的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 

,我们试着在列表中进行比较,如果它包含同样的事情列表如下:

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

+0

1)确定有实际需要删除重复? 2)你的问题实际上并不清楚 - 也许如果你有一个例子来说明'a'和'b'(请使用更好的变量名称)以及你期望输出是什么? –

+0

我认为你的逻辑是倒退的。没有必要通过字典来枚举。您只需枚举整个列表并使用WHERE生成输出,并且项目不会出现在字典中。使用词典CONTAINS方法。 – jdweng

+0

100%有重复我会在原始文章底部添加更多预期的输入/输出 – PhillipsJP

回答

0

你不应该翻翻字典,并を需要循环这样做效率低下。所有你需要的应该是这样的:

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

所以,你是否b包含Parent.Name如果确实如此,那么你检查是否名单该条只包含x。说了这么多,我不确定你的原始代码不应该工作 - 所以你的实际问题可能在别的地方。

您的问题实际上可能来自Contains部分。由于DirectoryInfo是一个类,因此它将为Contains做参考相等。换句话说,只有当您在ab的同一个对象中引用时,它才会起作用。如果他们不一样,那么你将不得不比较这些值。

喜欢的东西:

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

假设比较FullName 2个DirectoryInfo的对象是你想要的东西

+0

我不认为这会工作,因为做b [x.Parent.Name]我不认为这就是你如何识别不同的字典值是吗?此外,我不想比较全名,因为它没有相同的根路径,只是名称和父名相同 – PhillipsJP

+0

@PhillipsJP:当然是这样。您正在提供密钥('Name')并检索列表。这就是'Dictionary'的用途。 –

+0

@PhillipsJP:*“我也不想比较全名”*然后不要。代替'Name'代替。 –