使用重复元素过滤数组

kin*_*005 3 .net c# arrays duplicates

我有一个FileInfo对象数组,其中包含我想要过滤的重复元素,即删除重复项,元素按上次写入时间使用自定义比较器排序.文件名的格式如下:

file {number} {YYYMMDD} {HHMMSS} .txt

我想知道的是,是否有一种优雅的方法可以过滤掉具有相同文件编号的两个文件,以便列表中只有最新的文件,即我的数组中有两个元素,文件名如下:

file1_20110214_090020.txt

file1_20101214_090020.txt

我想保留最新版本的file1.我获取文件的代码如下:

 FileInfo[] listOfFiles = diSearch.GetFiles(fileSearch);
 IComparer compare = new FileComparer(FileComparer.CompareBy.LastWriteTime);
 Array.Sort(listOfFiles, compare);
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

更新:

忘了添加警告,有问题的程序使用.Net 2.0,所以不幸的是没有LINQ.对不起,上面我纠正了文件编号是一样的

Ani*_*Ani 5

使用LINQ,您可以:

var listOfFiles = diSearch
                  .GetFiles(fileSearch)
                  .GroupBy(file => file.Name.Substring(file.Name.IndexOf('_')))
                  .Select(g => g.OrderBy(file => file.LastWriteTime).Last())
                  .ToArray();
Run Code Online (Sandbox Code Playgroud)

如果您希望这些文件也按上次写入时间排序,请在调用.OrderByDescending(file => file.LastWriteTime)之前输入ToArray.

您当然可以使用更有效的技术从每个组中查找最新文件,例如使用MaxBy运算符.

编辑:

在.NET 2.0中,您可以Dictionary<string, List<FileInfo>>从数组中构造一个(键为"文件组"),然后从字典集合的每个列表中提取最新文件Values,以生成结果.

如果您使用的是C#3或更高版本,则另一种选择是使用LINQBridge,它允许您在针对.NET 2.0时使用LINQ to Objects.