如何对字符串数组进行排序或将 IEnumerable<string> 转换为字符串数组?

How do I sort string arrays or convert IEnumerable<string> to string array?

我正在尝试将文件分类为扩展名为 .RAR 和 .ZIP 的字符串数组,以供以后使用。 args 参数通常是文件路径字符串,数量可能不同。

例如

args = {"..\test1.rar", "..\test2.rar", "..\source.txt", "..\randomfile.exe", "test3.zip"}

这个代码

public void ValidateFiles(string[] args) {
    var validRar = from item in args
        where Path.GetExtension(item) == ".rar" || Path.GetExtension(item) == ".r00"
        select item;
    var validZip = from item in args
        where Path.GetExtension(item) == ".zip"
        select item;

    //do some more stuff 
}

使 validRarvalidZip 成为 IEnumerable<string> 类型。我该如何将它们排序为 string[] 呢?

最佳结果是

string[] validRar = {"test1.rar", "test2.rar"}
string[] validZip = {"test3.zip"}

您只需拨打 ToArray:

public void ValidateFiles(string[] args)
{

    var validRar = (from item in args
        where Path.GetExtension(item) == ".rar" ||
              Path.GetExtension(item) == ".r00"
        select item).ToArray();
    var validZip = (from item in args
        where Path.GetExtension(item) == ".zip"
        select item).ToArray();

//do some more stuff 
}

现在,validRarvalidZip都是string[]

IEnumerable<T> 转换为数组 T[] 的一种方法是对其调用 ToArray()

var validRarArray = (from item in args
    where Path.GetExtension(item) == ".rar" || Path.GetExtension(item) == ".r00"
    select item).ToArray();

使用流畅的语法代替查询语法会更容易做到:

var validRarArray = args
    .Where(item => Path.GetExtension(item) == ".rar" || Path.GetExtension(item) == ".r00")
    .ToArray();

你可以做一个切片数组的扩展方法:

public static T[] Categorize<T>(this T[] data, string extensions[])
{
    //using List to make copying easier
    List<T> result = new List<T>();

    foreach(string extension in extensions)
    {    
        var filteredData = (from item in data
                            where Path.GetExtension(item) == extension
                            select item)
        result.AddRange(filteredData);
    }

    return result.ToArray();
}

并这样称呼它:

public void ValidateFiles(string[] args){
    var rarArray = args.Categorize<string>(new string[] {"rar", ".r00"});
}

另一种选择是使用 Array.FindAll 两次:

string[] validRar = Array.FindAll(args, f => Path.GetExtension(f) == ".rar" || Path.GetExtension(f) == ".r00");
string[] validZip = Array.FindAll(args, f => Path.GetExtension(f) == ".zip");