如何对字符串数组进行排序或将 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
}
使 validRar
和 validZip
成为 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
}
现在,validRar
和validZip
都是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");
我正在尝试将文件分类为扩展名为 .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"}
您只需拨打 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[]
。
将 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");