C# 排序列表<;FileInfo>;按自然顺序排列。
我有一个从WCF服务返回的列表,用于服务器上的文件列表。 稍后我将使用它在客户端应用程序中填充TreeView 我需要列表按自然顺序排列 例如: 我有一个类似于C# 排序列表<;FileInfo>;按自然顺序排列。,c#,list,fileinfo,C#,List,Fileinfo,我有一个从WCF服务返回的列表,用于服务器上的文件列表。 稍后我将使用它在客户端应用程序中填充TreeView 我需要列表按自然顺序排列 例如: 我有一个类似于list-1的列表,我的预期结果是list-2 但是我得到了List-3作为我的输出。(参考下面给出的列表) 到目前为止,我已经查看了stackoverflow的帖子: [1] :[2]: 如果发现他们中没有人为我的案子工作,我们将不胜感激:)给你;用于自然排序的便捷列表扩展: using System; using System.Col
list-1
的列表,我的预期结果是list-2
但是我得到了List-3
作为我的输出。(参考下面给出的列表)
到目前为止,我已经查看了stackoverflow的帖子:
[1] :[2]:
如果发现他们中没有人为我的案子工作,我们将不胜感激:)给你;用于自然排序的便捷列表扩展:
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);
}
}
}
这利用了Windows API方法,该方法执行自然排序顺序比较,并使用p/Invoke调用它;用于自然排序的便捷列表扩展:
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);
}
}
}
这利用了Windows API方法,该方法执行自然排序顺序比较,并使用p/Invoke调用它;用于自然排序的便捷列表扩展:
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);
}
}
}
这利用了Windows API方法,该方法执行自然排序顺序比较,并使用p/Invoke调用它;用于自然排序的便捷列表扩展:
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);
}
}
}
这利用了Windows API方法,该方法执行自然排序顺序比较,并使用p/Invoke来调用它。您的文件名是否总是包含非数字字符,然后是可选数字?或者如何?可能是任何内容。。在任何文件系统中,我们如何给出文件名您的文件名总是包含非数字字符,然后是可选的数字吗?或者呢?不,它可以是任何东西。。在任何文件系统中,我们如何给出文件名您的文件名总是包含非数字字符,然后是可选的数字吗?或者呢?不,它可以是任何东西。。在任何文件系统中,我们如何给出文件名您的文件名总是包含非数字字符,然后是可选的数字吗?或者呢?不,它可以是任何东西。。如何在任何文件系统中指定文件名对不起,沃森,但我不想这样做,因为它已经是一个大应用程序了,为一个简单的任务添加Dll还不够好,它们也应该是一些更简单的方法。@MakIndia您不是在添加Dll;该DLL已经是Windows API的一部分,并且将安装在所有版本的Windows上。我很怀疑你会找到比这更简单的方法(实际上只使用一行代码来声明P/Invoke,一行代码来调用它…)只是澄清我的疑问:我的意思是在所有版本的windows 7,8中,它会一直存在吗?它的访问权限呢?如果系统的访问权限有限怎么办,它仍然可以工作得很好。&是的,它会工作得很好。它是Windows API的一个基本部分,自Windows 98以来就一直存在。它不太可能从任何未来版本的Windows中删除;这将破坏许多应用程序@csharpcoder为此,您必须使用
SortedDictionary
,以及使用strmplogical()实现的自定义IComparer
。这不是一个完全琐碎的问题,这是一个不同的问题,所以你应该问一个新问题。对不起,沃森,但我不想这样做,因为它已经是一个大的应用程序,为一个简单的任务添加Dll还不够好,它们应该是一些更简单的方法。@MakIndia你没有添加Dll;该DLL已经是Windows API的一部分,并且将安装在所有版本的Windows上。我很怀疑你会找到比这更简单的方法(实际上只使用一行代码来声明P/Invoke,一行代码来调用它…)只是澄清我的疑问:我的意思是在所有版本的windows 7,8中,它会一直存在吗?它的访问权限呢?如果系统的访问权限有限怎么办,它仍然可以工作得很好。&是的,它会工作得很好。它是Windows API的一个基本部分,自Windows 98以来就一直存在。它不太可能从任何未来版本的Windows中删除;这将破坏许多应用程序@csharpcoder为此,您必须使用SortedDictionary
,以及使用strmplogical()实现的自定义IComparer
。这不是一个完全琐碎的问题,这是一个不同的问题,所以你应该问一个新问题。对不起,沃森,但我不想这样做,因为它已经是一个大的应用程序,为一个简单的任务添加Dll还不够好,它们应该是一些更简单的方法。@MakIndia你没有添加Dll;该DLL已经是Windows API的一部分,并且将安装在所有版本的Windows上。我很怀疑你会找到比这更简单的方法(实际上只使用一行代码来声明P/Invoke,一行代码来调用它…)只是澄清我的疑问:我的意思是在所有版本的windows 7,8中,它会一直存在吗?它的访问权限呢?如果系统的访问权限有限怎么办,它仍然可以工作得很好。&是的,它会工作得很好。它是Windows API的一个基本部分,自Windows 98以来就一直存在。它不太可能从任何未来版本的Windows中删除;这将破坏许多应用程序@csharpcoder为此,您必须使用SortedDictionary
,以及使用strmplogical()实现的自定义IComparer
。这不是一个完全琐碎的问题,这是一个不同的问题,所以你应该问一个新问题。对不起,沃森,但我不想这样做,因为它已经是一个大的应用程序,为一个简单的任务添加Dll还不够好,它们应该是一些更简单的方法。@MakIndia你没有添加Dll;该DLL已经是Windows API的一部分,并且将安装在所有版本的Windows上。我严重怀疑您是否会找到比这更简单的方法(实际上只使用一行代码来声明P/Invoke,一行代码来声明P/Invoke)