Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Foreach循环C中使用Orderby有困难#_C# - Fatal编程技术网

C# 在Foreach循环C中使用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; 字符串文

我一直在尝试按文件名称末尾的子字符串对文件进行排序,该子字符串恰好以一个数字结尾,该数字指示文件相对于其余文件的位置。(示例:fs-1632_1.txt-->fs-1632_2.txt)

我目前能够获取数字并将其转换为整数,但我在让OrderBy方法正常工作时遇到了问题。我大部分时间都在工作

内部类数据
{
公共字符串名称{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