在DataView行中查找下一个更高的值

时间:2015-12-06 21:04:50

标签: c# select filter find dataview

我有 DataView ,其中PathName行包含的名称如下:

"C:\$Recycle.Bin\S-1-5-21-1993492240-2256127134-121505747-1000"
"C:\$Recycle.Bin\S-1-5-21-1993492240-2256127134-121505747-1004"
"C:\Program Files (x86)\Common Files\microsoft shared\DAO\dao360.dll"
"C:\Program Files (x86)\Common Files\microsoft shared\ink\1.0\Microsoft.Ink.dll"
"C:\Program Files (x86)\Common Files\microsoft shared\ink\de-DE\InkObj.dll.mui"
"C:\Windows\System32\de-DE\Query.dll.mui"
"C:\Windows\System32\de-DE\query.exe.mui"
"C:\Windows\System32\de-DE\quser.exe.mui"
"C:\Windows\System32\de-DE\Qutil.dll.mui"
"C:\Windows\System32\DriverStore\FileRepository\bth.inf_amd64_neutral_de0494b6391d872c\bthport.sys"
"C:\Windows\System32\DriverStore\FileRepository\bth.inf_amd64_neutral_de0494b6391d872c\BTHUSB.SYS"
"C:\Windows\System32\DriverStore\FileRepository\bth.inf_amd64_neutral_e54666f6a3e5af91\bthenum.sys"

对于任何指定路径,我需要获取子文件夹。

路径“C:\”

的子文件夹
"$Recycle.Bin"
"Program Files (x86)"
"Windows"

我目前正在做的是:

  • 扩展当前的rowfilter:MyDataView.rowfilter += " and (PathName LIKE 'c:\%')"
  • 首先,我找到C:\$Recycle.Bin\S-1-5-21-1993492240-2256127134-121505747-1000并提取C:\$Recycle.Bin
  • 然后我遍历行,直到找到与C:\$Recycle.Bin不同的内容,例如C:\Program Files (x86)\...

DataView可能包含100.000和更多条目,因此这种方式需要很长时间。

一种可能性是在每次击中后扩展rowfilter:

MyDataView.rowfilter += " and (PathName LIKE 'c:\%')" + " and (PathName NOT LIKE 'C:\$Recycle.Bin\%')". 

但路径名可能会变得很长,这会导致rowfilter中的堆栈溢出。

还有其他方式,比如“获得更高的价值”吗?

修改
必须找到任何给定路径的子文件夹,不仅适用于c:\

1 个答案:

答案 0 :(得分:1)

如果我理解正确,可以使用一行Linq来完成 (为了便于阅读,分成多行)

var dirs = dv.Table
             .AsEnumerable()
             .Select(x => Path.GetDirectoryName(x.Field<string>("PathName")))
             .Distinct();

技巧包括使用Path.GetDirectoryName从每一行中提取字段PathName的值,并使用Select方法创建一个可枚举的字符串。然后Distinct方法只返回集合中的唯一目录名称。

如果您的DataView已针对某些其他条件进行了过滤,并且您希望保持此条件以排除记录子集,则可以使用Where方法提取所需的记录。例如,要排除以“C:\ WINDOWS”开头的每条记录,您可以编写

var dirs = dv.Table
             .AsEnumerable()
             .Where(k => !k.Field<string>("PathName").StartsWith(@"C:\WINDOWS"))
             .Select(x => Path.GetDirectoryName(x.Field<string>("PathName")))
             .Distinct();