以自然排序顺序排序列表<FileInfo>。
Sorting List<FileInfo> in Natural sorted order .
我有一个从 WCF 服务返回的列表,用于服务器上的文件列表。
我稍后用它来填充我的客户端应用程序中的 TreeView
我需要列表自然排序。
For ex :
I have a list something like List-1
, and my expected result is List-2
but i get List-3
as my output.(refer list given below)
List-1 List-2 List-3
abc.jpg abc.jpg abc.jpg
abc10.jpg abc10.jpg abc10.jpg
abc100.jpg abc97.jpg abc100.jpg
abc98.jpg abc98.jpg abc101.jpg
abc97.jpg abc100.jpg abc102.jpg
abc102.jpg abc101.jpg abc97.jpg
abc101.jpg abc102.jpg abc98.jpg
到目前为止,我已经研究了 Whosebug 的 post:
[1] :C# Sort files by natural number ordering in the name? [2]: Sorting a FileInfo[] based using Natural Sorting on the filename (SQL files) .
None 被发现为我的案子工作,任何帮助将不胜感激:)
给你;一个方便的自然排序列表扩展:
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace Demo
{
// A List extension class for natural sorting.
public static class ListExt
{
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
private static extern int StrCmpLogicalW(string lhs, string rhs);
// Version for lists of any type.
public static void SortNatural<T>(this List<T> self, Func<T, string> stringSelector)
{
self.Sort((lhs, rhs) => StrCmpLogicalW(stringSelector(lhs), stringSelector(rhs)));
}
// Simpler version for List<string>
public static void SortNatural(this List<string> self)
{
self.Sort(StrCmpLogicalW);
}
}
// Demonstrate using the List extension.
public class Program
{
private static void Main(string[] args)
{
var names = new List<FileInfo>
{
new FileInfo("abc.jpg"),
new FileInfo("abc10.jpg"),
new FileInfo("abc100.jpg"),
new FileInfo("abc98.jpg"),
new FileInfo("abc97.jpg"),
new FileInfo("abc102.jpg"),
new FileInfo("abc101.jpg")
};
names.SortNatural(x => x.Name);
foreach (var name in names)
Console.WriteLine(name);
}
}
}
这个程序的输出是:
abc.jpg
abc10.jpg
abc97.jpg
abc98.jpg
abc100.jpg
abc101.jpg
abc102.jpg
这利用了 Windows API StrCmpLogicalW()
方法进行自然排序顺序比较,并使用 P/Invoke 调用它。
我有一个从 WCF 服务返回的列表,用于服务器上的文件列表。 我稍后用它来填充我的客户端应用程序中的 TreeView
我需要列表自然排序。
For ex : I have a list something like
List-1
, and my expected result isList-2
but i getList-3
as my output.(refer list given below)
List-1 List-2 List-3
abc.jpg abc.jpg abc.jpg
abc10.jpg abc10.jpg abc10.jpg
abc100.jpg abc97.jpg abc100.jpg
abc98.jpg abc98.jpg abc101.jpg
abc97.jpg abc100.jpg abc102.jpg
abc102.jpg abc101.jpg abc97.jpg
abc101.jpg abc102.jpg abc98.jpg
到目前为止,我已经研究了 Whosebug 的 post:
[1] :C# Sort files by natural number ordering in the name? [2]: Sorting a FileInfo[] based using Natural Sorting on the filename (SQL files) .
None 被发现为我的案子工作,任何帮助将不胜感激:)
给你;一个方便的自然排序列表扩展:
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace Demo
{
// A List extension class for natural sorting.
public static class ListExt
{
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
private static extern int StrCmpLogicalW(string lhs, string rhs);
// Version for lists of any type.
public static void SortNatural<T>(this List<T> self, Func<T, string> stringSelector)
{
self.Sort((lhs, rhs) => StrCmpLogicalW(stringSelector(lhs), stringSelector(rhs)));
}
// Simpler version for List<string>
public static void SortNatural(this List<string> self)
{
self.Sort(StrCmpLogicalW);
}
}
// Demonstrate using the List extension.
public class Program
{
private static void Main(string[] args)
{
var names = new List<FileInfo>
{
new FileInfo("abc.jpg"),
new FileInfo("abc10.jpg"),
new FileInfo("abc100.jpg"),
new FileInfo("abc98.jpg"),
new FileInfo("abc97.jpg"),
new FileInfo("abc102.jpg"),
new FileInfo("abc101.jpg")
};
names.SortNatural(x => x.Name);
foreach (var name in names)
Console.WriteLine(name);
}
}
}
这个程序的输出是:
abc.jpg
abc10.jpg
abc97.jpg
abc98.jpg
abc100.jpg
abc101.jpg
abc102.jpg
这利用了 Windows API StrCmpLogicalW()
方法进行自然排序顺序比较,并使用 P/Invoke 调用它。