C# 在foreach循环中按数字顺序排序

C# 在foreach循环中按数字顺序排序,c#,C#,所以我正在制作一个程序,它会给我一个列表,但是列表不符合顺序。我需要列出一个有序的列表,比如 1.txt 2.txt 3.txt 然而,它的出现就像 2.txt 1.txt 3.txt 都是随机排列的。我用的是 foreach (var file in d.GetFiles("*.txt")) { tosend = tosend + file.Name + "\n"; } 谢谢你,洛根! 更新: 我不想要一根线。在获得文件名后,它将读取其集合中其他文件的文

所以我正在制作一个程序,它会给我一个列表,但是列表不符合顺序。我需要列出一个有序的列表,比如

1.txt
2.txt
3.txt
然而,它的出现就像

2.txt
1.txt
3.txt
都是随机排列的。我用的是

foreach (var file in d.GetFiles("*.txt"))
{                 
tosend = tosend + file.Name + "\n";
}
谢谢你,洛根! 更新: 我不想要一根线。在获得文件名后,它将读取其集合中其他文件的文本并添加它。所以像[1.txt]文本一样

使用Linq

// top of code file
using System.Linq;
在方法上:

var files = d.GetFiles("*.txt").OrderBy(file => file.Name).ToList();
或者按照您的示例作为字符串

string tosend = string.Join("\n", d.GetFiles("*.txt")
         .Select(file => file.Name)
         .OrderBy(x => x));
这将使用
\n
作为分隔符连接返回的有序文件名列表。

使用LINQ

foreach (var file in d.GetFiles("*.txt").OrderBy(x => x.Name).ToList())
{
    ...
}
编辑 如果文件一直是number.txt,您可以使用

foreach (var file in d.GetFiles("*.txt").OrderBy(x => int.Parse(x.Name.Substring(0,x.Name.IndexOf(".txt"))).ToList())
{
    ...
}

您需要添加一些错误检查,或者您可以对数组进行排序:

string[] files = d.GetFiles("*.txt")
Array.Sort(files, StringComparer.InvariantCulture);
foreach (var file in files)
{                 
   tosend = tosend + file.Name + "\n";
}
如果你正在寻找自然的排序,即

您可以使用Interop作为一种快速(可能是一种肮脏的)解决方案(有关详细信息,请参阅)


“返回文件名的顺序不受保证;如果需要特定的排序顺序,请使用
排序
方法”,如果文件是
10.txt
9.txt
1.txt
,该怎么办。你现在想要什么样的顺序?@EricLippert我只想让它们数一数,但我不想列出来。因为在结束后不会有一件事发生。它必须是其他的东西,所以都在一行上。看起来OP想要的是文本字符串中的列表,而不是
list
对象。@loganrise-我添加了第二个如何使用linq的示例。在这里,您可以看到一个由
“\n”
@loganrise(按顺序)连接的文件名字符串-请参见Eric的评论,当你处理数字时,按字母顺序排序不太有效。
ToList
的显著优点是什么?不太有效。请看上面的编辑,因为它没有按你想要的方式工作。你得到修复的速度比我给你的快了一点,我个人认为我的更可读,取决于你
d.GetFiles(“*.txt”).OrderBy(f=>Int32.Parse(f.Name.Split('.').First()).ToList()不需要ToList,因为foreach循环将强制执行查询(这就是ToList可能存在的原因)。如果您删除ToList,您将看到它执行相同的操作。不工作文件字符串[]文件对system.ioHmm无效。我现在没有办法尝试它,但根据文档()它应该可以工作。@BJ Myers:
strmplogicw
是文件资源管理器用于排序文件的函数,但你说得很对:互操作通常是一个肮脏的解决方案,即使它是一个快速的解决方案。
  1.txt
  9.txt
 10.txt 
using System.Runtime.InteropServices;

...

[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
private static extern int StrCmpLogicalW(string left, string right);

...

// Obtain files
var files = d.GetFiles();

// Sort files in natural order
Array.Sort(files, (left, right) => StrCmpLogicalW(left.Name, right.Name));

// combine files' names into the string
string tosend = string.Join("\n", files);