我是否需要创建一个对象来按我的"数字排序"元件?

时间:2017-08-17 15:03:55

标签: c# arrays algorithm sorting

我的文件编号系统刚刚超过100,000,这导致了一些问题。也就是说它导致程序在#99,999之前组织#100,000,因为它首先看到1。

例如,另一个程序会按升序读取文件:

  

XXXX_100000_XXXXXX.file

     

XXXX_10001_XXXXXX.file

     

XXXX_99999_XXXXXX.file

但它应该去:

  

XXXX_10001_XXXXXX.file

     

XXXX_99999_XXXXXX.file

     

XXXX_100000_XXXXXX.file

我有一个函数可以读取所有文件,按编号对它们进行排序,然后按顺序将它们放入一个新的数组中。这里有一些伪代码:

while(my directory has more files)

//this entire chunk assigns the number part of the filename to an int
string filename = my file
string num = filename[5] through filename[11]    
//checks if the number is 5 digits, if yes, removes the underscore
if(num at position [11] == "_"){ 
num = num[5] through num[10]
}
int fileNum = num.toInteger

//now I have the number as an int

修改: 我刚刚意识到,通过在文件名上调用.Split并将arr[1]转换为int,我可以更轻松地获取该号码。我会留下旧代码以获得乐趣。

在这里,我被困住了。我希望将这些数据提供给一个新的数组,排序,或者在所有内容都存在之后使数组可以排序。

我是否需要创建一个文件名和数字作为元素的对象,将所有对象输入,然后按数字对数组进行排序?我知道这会有用,但我无法帮助,但我认为这是一种更有效的方法。

我不需要为我编写代码,我只需要帮助编制算法逻辑,或者如果我的方式已经是最好的方式,请告诉我!

3 个答案:

答案 0 :(得分:1)

如果您有未排序的文件名数组,例如

string[] fileNames = ...

和从名称中提取数字的功能,例如

public static int GetFileNumber(string myfile) {
    string num = filename[5] through filename[11]    
    //checks if the number is 5 digits, if yes, removes the underscore
    if(num at position [11] == "_"){ 
    num = num[5] through num[10]
    }
    return num.toInteger
}

然后您可以使用Array.Sort对其进行排序:

Array.Sort(fileNames, (f1, f2) => GetFileNumber(f1).CompareTo(GetFileNumber(f2)));

答案 1 :(得分:0)

你可以尝试使用int数组作为文件名的数字和字符串数组,然后将其推送到集合,最后对集合进行排序吗?

使用创建集合 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/collections

然后用它对集合进行排序 https://sankarsan.wordpress.com/2011/05/07/sorting-collections-in-c/

很抱歉,如果我的帮助不大。

答案 2 :(得分:0)

您可以使用"字母数字排序"对字符串列表进行排序。这将使" 100"在" 9"。

之后

示例:https://www.dotnetperls.com/alphanumeric-sorting