C# 在Foreach循环C中使用Orderby有困难#
我一直在尝试按文件名称末尾的子字符串对文件进行排序,该子字符串恰好以一个数字结尾,该数字指示文件相对于其余文件的位置。(示例:fs-1632_1.txt-->fs-1632_2.txt) 我目前能够获取数字并将其转换为整数,但我在让OrderBy方法正常工作时遇到了问题。我大部分时间都在工作C# 在Foreach循环C中使用Orderby有困难#,c#,C#,我一直在尝试按文件名称末尾的子字符串对文件进行排序,该子字符串恰好以一个数字结尾,该数字指示文件相对于其余文件的位置。(示例:fs-1632_1.txt-->fs-1632_2.txt) 我目前能够获取数字并将其转换为整数,但我在让OrderBy方法正常工作时遇到了问题。我大部分时间都在工作 内部类数据 { 公共字符串名称{get;set;} 公共双精度数{get;set;} } 私有void OrderByEx1(列表文件) { int num=0; int index_num=0; 字符串文
内部类数据
{
公共字符串名称{get;set;}
公共双精度数{get;set;}
}
私有void OrderByEx1(列表文件)
{
int num=0;
int index_num=0;
字符串文件_num=“”;
字符串文件_name=“”;
foreach(文件中的文件信息)
{
file_name=file.FullName;
file_name=Path.getfilename withoutextension(文件名);
index_num=文件名.LastIndexOf(“”)+1;
file_num=file_name.Substring(index_num);
num=Int32.Parse(文件\u num);
Data[]set={newdata{Name=文件名,Number=num}};
}
IEnumerable query=set.OrderBy(data=>data.Number);
foreach(查询中的数据文件)
Show($“{file_.s.Name}{file_.s.Number}”);
}
如果要声明名为set的数据数组,请向其中添加一个元素,然后重新启动循环,忘记在上一个循环中加载的内容。仅当退出循环时,才会执行该命令,但此时集合数组包含一个元素,即最后一个元素
您需要将数据结构添加到列表中,然后对该列表进行排序
List<Data> dataFiles = new List<Data>();
foreach (FileInfo file in files)
{
file_name = file.FullName;
file_name = Path.GetFileNameWithoutExtension(file_name);
index_num = file_name.LastIndexOf("_") + 1;
file_num = file_name.Substring(index_num);
num = Int32.Parse(file_num);
dataFiles.Add(new Data {Name = file_name, Number = num });
}
// If you don't need the query var you can just order directly in the for loop
// IEnumerable<Data> query = dataFiles.OrderBy(data => data.Number);
foreach (Data file_s in dataFiles.OrderBy(data => data.Number))
{
MessageBox.Show(file_s.Name + " " + file_s.Number);
}
List dataFiles=new List();
foreach(文件中的文件信息文件)
{
file_name=file.FullName;
file_name=Path.getfilename withoutextension(文件名);
index_num=文件名.LastIndexOf(“”)+1;
file_num=file_name.Substring(index_num);
num=Int32.Parse(文件\u num);
添加(新数据{Name=file\u Name,Number=num});
}
//如果不需要查询变量,可以直接在for循环中排序
//IEnumerable query=dataFiles.OrderBy(data=>data.Number);
foreach(dataFiles.OrderBy(Data=>Data.Number)中的数据文件)
{
MessageBox.Show(文件名+“”+文件号);
}
如果要声明名为set的数据数组,请向其中添加一个元素,然后重新启动循环,忘记在上一个循环中加载的内容。仅当退出循环时,才会执行该命令,但此时集合数组包含一个元素,即最后一个元素
您需要将数据结构添加到列表中,然后对该列表进行排序
List<Data> dataFiles = new List<Data>();
foreach (FileInfo file in files)
{
file_name = file.FullName;
file_name = Path.GetFileNameWithoutExtension(file_name);
index_num = file_name.LastIndexOf("_") + 1;
file_num = file_name.Substring(index_num);
num = Int32.Parse(file_num);
dataFiles.Add(new Data {Name = file_name, Number = num });
}
// If you don't need the query var you can just order directly in the for loop
// IEnumerable<Data> query = dataFiles.OrderBy(data => data.Number);
foreach (Data file_s in dataFiles.OrderBy(data => data.Number))
{
MessageBox.Show(file_s.Name + " " + file_s.Number);
}
List dataFiles=new List();
foreach(文件中的文件信息文件)
{
file_name=file.FullName;
file_name=Path.getfilename withoutextension(文件名);
index_num=文件名.LastIndexOf(“”)+1;
file_num=file_name.Substring(index_num);
num=Int32.Parse(文件\u num);
添加(新数据{Name=file\u Name,Number=num});
}
//如果不需要查询变量,可以直接在for循环中排序
//IEnumerable query=dataFiles.OrderBy(data=>data.Number);
foreach(dataFiles.OrderBy(Data=>Data.Number)中的数据文件)
{
MessageBox.Show(文件名+“”+文件号);
}
无需使用foreach
-循环。您可以使用这种安全的LINQ方法:
files = files
.Select(f => new { File = f, Name = Path.GetFileNameWithoutExtension(f.Name) })
.Select(x => new
{
x.File,
x.Name,
Token = x.Name.Substring(x.Name.LastIndexOf("_", StringComparison.Ordinal) + 1)
})
.Select(x => new
{
x.File,
x.Name,
x.Token,
IsInt = int.TryParse(x.Token, out int number),
ParsedNumber = number
})
.OrderByDescending(x => x.IsInt)
.ThenBy(x => x.ParsedNumber)
.Select(x => x.File)
.ToList();
如果没有数字或无法解析为int
,则文件将列在底部。无需使用foreach
-循环。您可以使用这种安全的LINQ方法:
files = files
.Select(f => new { File = f, Name = Path.GetFileNameWithoutExtension(f.Name) })
.Select(x => new
{
x.File,
x.Name,
Token = x.Name.Substring(x.Name.LastIndexOf("_", StringComparison.Ordinal) + 1)
})
.Select(x => new
{
x.File,
x.Name,
x.Token,
IsInt = int.TryParse(x.Token, out int number),
ParsedNumber = number
})
.OrderByDescending(x => x.IsInt)
.ThenBy(x => x.ParsedNumber)
.Select(x => x.File)
.ToList();
如果没有数字或无法将其解析为int
,文件将列在底部。我只是有问题
-什么问题?具体点。结果是空的?顺序不对?错误的结果?如果Number=num
不是Number=file\u num
它根本不工作,我不知道如何使用它,代码甚至不能按当前显示的方式运行。所有过去的num=Int32.Parse(file_num);不work@Jaxi可能不是,因为file_num
是字母数字,num
是数字。使用file_num
将进行alphanumeric排序,将11之后的2排序。此外,set正在范围外访问,因此肯定也不会工作?我只是有问题
-什么问题?具体点。结果是空的?顺序不对?错误的结果?如果Number=num
不是Number=file\u num
它根本不工作,我不知道如何使用它,代码甚至不能按当前显示的方式运行。所有过去的num=Int32.Parse(file_num);不work@Jaxi可能不是,因为file_num
是字母数字,num
是数字。使用file_num
将进行alphanumeric排序,将11之后的2排序。此外,set正在范围外访问,因此肯定也不起作用?谢谢Steve,这回答了我的问题。我有一种感觉,我必须做一些像你刚刚发布的东西;我只是在正确实例化列表时遇到问题。谢谢!再看看Tim Schmelter的答案。虽然有点难以理解,但它向你展示了linq的强大力量。谢谢你,Steve,这回答了我的问题。我有一种感觉,我必须做一些像你刚刚发布的东西;我只是在正确实例化列表时遇到问题。谢谢!再看看Tim Schmelter的答案。虽然有点难以理解,但它向您展示了linq的强大功能。对我来说,这基本上是不可读的,我只是开始编写一般的代码,更不用说C了。我会尽力理解这里发生了什么,但我喜欢史蒂文斯answer@Reachingout我知道你的意思,LINQ一开始看起来像是一种全新的语言,这可能是因为它是如何受到SQL的启发的。不过,它功能强大,非常有用,因此值得研究。@TimSchmelter你有什么理由用三个选项而不是一个选项吗?@Reachingout我完全理解你的意思,我是p