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

时间:2017-12-10 11:18:31

标签: c# arrays string linq ienumerable

我正在尝试将文件排序为扩展名.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 
}

制作validRar类型的validZipIEnumerable<string>。如何将它们排序为string[]

最佳结果将是

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

4 个答案:

答案 0 :(得分:1)

您只需致电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[]

答案 1 :(得分:1)

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();

答案 2 :(得分:0)

您可以使用扩展方法来切割数组:

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"});
}

答案 3 :(得分:0)

另一种选择是使用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");