我正在尝试将文件排序为扩展名.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
类型的validZip
和IEnumerable<string>
。如何将它们排序为string[]
?
最佳结果将是
string[] validRar = {"test1.rar", "test2.rar"}
string[] validZip = {"test3.zip"}
答案 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
}
现在,validRar
和validZip
都是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");