C# 如何对FileInfo[]数组进行排序
我有以下代码C# 如何对FileInfo[]数组进行排序,c#,.net-2.0,.net,C#,.net 2.0,.net,我有以下代码 DirectoryInfo taskDirectory = new DirectoryInfo(this.taskDirectoryPath); FileInfo[] taskFiles = taskDirectory.GetFiles("*" + blah + "*.xml"); 我想按文件名对列表进行排序 如何使用.NETV2尽可能快速、轻松地完成此操作 Comparison Comparison=新比较(委托(文件信息a、文件信息b) Comparison<FileI
DirectoryInfo taskDirectory = new DirectoryInfo(this.taskDirectoryPath);
FileInfo[] taskFiles = taskDirectory.GetFiles("*" + blah + "*.xml");
我想按文件名对列表进行排序
如何使用.NETV2尽可能快速、轻松地完成此操作 Comparison Comparison=新比较(委托(文件信息a、文件信息b)
Comparison<FileInfo> comparison = new Comparison<FileInfo>(delegate(FileInfo a, FileInfo b)
{
return String.Compare(a.Name, b.Name);
});
Array.Sort(taskFiles, comparison);
{
返回String.Compare(a.Name,b.Name);
});
排序(任务文件、比较);
但无论如何,我认为GetFiles的结果已经按名称排序了…调用数组。排序,传入一个比较委托:
Array.Sort(taskFiles, delegate(FileInfo f1, FileInfo f2) {
return f1.Name.CompareTo(f2.Name);
});
在C#3中,这变得稍微简单一些:
Array.Sort(taskFiles, (f1, f2) => f1.Name.CompareTo(f2.Name));
或者,如果要使用不区分大小写的排序顺序,可以使用StringComparer
:
Array.Sort(taskFiles,
(x, y) => StringComparer.OrdinalIgnoreCase.Compare(x.Name, y.Name));
(或者使用
string.Compare(x.Name,y.Name,true)
,或者其他任何一种比较字符串的方法:)@Thomas-但这并不能进行就地排序,这(我相信)是OP-wantsI只会添加的,可以使用vs2008使用c#3.0语法实现2.0目标。)@肯塔努拉:是的,但这里不仅涉及语法。。。System.Core程序集也是必需的,在.NET2.0中不可用。但是,使用LinqBridge()“但是无论如何,我认为GetFiles的结果已经按名称排序了…”来自MSDN:返回文件名的顺序不能保证GetFiles只在NTFS驱动器上返回按名称排序的文件,因为NTFS将名称存储为二叉树!这对FAT或任何其他文件系统无效。因此,您必须始终使用排序来确保输出已排序。顺便说一句,Explorer使用自然数比较对名称进行排序,因此,如果您想要实现类似的行为,您必须编写自己的比较器,将名称拆分为字符串和数字块,每个比较操作中都有大量的分支,为什么不为每种排序类型实例化一个专用的比较器呢?或者,基于CompareBy参数在构造函数中保存一个比较委托,然后在compare函数中执行该委托。
Array.Sort(taskFiles, delegate (FileInfo x, FileInfo y) {
return string.Compare(x.Name,y.Name);
});
public class FileComparer : IComparer
{
public enum CompareBy
{
Name /* a-z */,
LastWriteTime /* oldest to newest */,
CreationTime /* oldest to newest */,
LastAccessTime /* oldest to newest */,
FileSize /* smallest first */,
}
// default comparison
int _CompareBy = (int)CompareBy.Name;
public FileComparer()
{
}
public FileComparer(CompareBy compareBy)
{
_CompareBy = (int)compareBy;
}
int IComparer.Compare( object x, object y )
{
int output = 0;
DirectoryInfo file1 = new DirectoryInfo(x.ToString());
DirectoryInfo file2 = new DirectoryInfo(y.ToString());
switch(_CompareBy)
{
case (int)CompareBy.LastWriteTime:
output = DateTime.Compare(file1.LastWriteTime, file2.LastWriteTime);
break;
case (int)CompareBy.CreationTime:
output = DateTime.Compare(file1.CreationTime, file2.CreationTime);
break;
case (int)CompareBy.LastAccessTime:
output = DateTime.Compare(file1.LastAccessTime, file2.LastAccessTime);
break;
// case (int)CompareBy.FileSize:
// output = Convert.ToInt32(file1.Length - file2.Length);
// break;
case (int)CompareBy.Name:
default:
output = (new CaseInsensitiveComparer()).Compare( file1.Name, file2.Name );
break;
}
return output;
}
}
///////////////////////////////////
ArrayList list=new ArrayList();
string folder = @"D:\DVRData\ICICI\Transaction\21-Dec-08\08_51_23_2231";
string[] files = Directory.GetFiles(folder);
IComparer comp = new FileComparer(FileComparer.CompareBy.CreationTime);
Array.Sort(files, comp);
foreach(string file in files)
{
list.Add(file);
}