C# 如何对 FileInfo[] 数组进行排序
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1199006/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to sort an array of FileInfo[]
提问by JL.
I have the following code
我有以下代码
DirectoryInfo taskDirectory = new DirectoryInfo(this.taskDirectoryPath);
FileInfo[] taskFiles = taskDirectory.GetFiles("*" + blah + "*.xml");
I would like to sort the list by filename.
我想按文件名对列表进行排序。
How is this done, as quickly and easily as possible using .net v2.
这是如何使用 .net v2 尽可能快速、轻松地完成的。
采纳答案by Jon Skeet
Call Array.Sort, passing in a comparison delegate:
调用 Array.Sort,传入一个比较委托:
Array.Sort(taskFiles, delegate(FileInfo f1, FileInfo f2) {
return f1.Name.CompareTo(f2.Name);
});
In C# 3 this becomes slightly simpler:
在 C# 3 中,这变得稍微简单一些:
Array.Sort(taskFiles, (f1, f2) => f1.Name.CompareTo(f2.Name));
Or you can use a StringComparer
if you want to use a case-insensitive sort order:
或者,StringComparer
如果要使用不区分大小写的排序顺序,可以使用 a :
Array.Sort(taskFiles,
(x, y) => StringComparer.OrdinalIgnoreCase.Compare(x.Name, y.Name));
(or use string.Compare(x.Name, y.Name, true)
, or any of the many other ways of comparing strings :)
(或使用string.Compare(x.Name, y.Name, true)
,或任何其他比较字符串的方法:)
回答by Thomas Levesque
Comparison<FileInfo> comparison = new Comparison<FileInfo>(delegate(FileInfo a, FileInfo b)
{
return String.Compare(a.Name, b.Name);
});
Array.Sort(taskFiles, comparison);
But anyway I think the result of GetFiles is already sorted by name...
但无论如何我认为 GetFiles 的结果已经按名称排序......
回答by Marc Gravell
Array.Sort(taskFiles, delegate (FileInfo x, FileInfo y) {
return string.Compare(x.Name,y.Name);
});
回答by RV.
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-Dec-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);
}