版权声明:未经博主允许请勿转载 https://blog.csdn.net/qq_39040135/article/details/82955240
C#字符串数组的orderby排列方法及其在文件操作中的应用
/// <summary>
/// 按文件名中包含的日期字符串进行文件排序与筛选(日期只是一个样例,该方法的思路可以帮助应用到你的方法中)
/// </summary>
/// <param name="filenames"></param> 待处理文件的集合,集合中每一个元素都是一个文件的完整路径
/// <param name="Dstart"></param> 要筛选的日期的开始时间,我用的格式为"yyyyMMdd"
/// <param name="Dend"></param>要筛选的日期的结束时间,我用的格式为"yyyyMMdd"
/// <param name="LastTo"></param> 文件名中从后向前,文件中包含日期字符串的头部的index
/// <param name="SelectLength"></param>文件中包含的要排序和筛选的日期字符串的长度
/// <returns></returns> 返还一个自定义的结构体,其中包含了按日期区间筛选处理后的文件流,和从原文件数组中筛选出的日期信息
public struct dateorder
{
public string[] filenames;
public string date;
}
public struct filewithdate
{
public string filename;
public string filedate;
}
public static dateorder FileSelectByName(string[] filenames, string Dstart, string Dend,int LastTo,int SelectLength)
{
dateorder FileTool = new dateorder();
FileTool.date = "";
filewithdate[] files = new filewithdate[filenames.Length]; int num = 0;
foreach (string file in filenames)
{
FileInfo fi = new FileInfo(file);
files[num].filename = file;
files[num].filedate = fi.Name.Replace(fi.Extension, "").Substring(fi.Name.Replace(fi.Extension, "").Length - LastTo, SelectLength); num++;
}
//定义var强类型容器,盛放待排序和操作的字符串
var DateOrder = from fileschild in files //历遍待处理文件数组中的文件
orderby fileschild.filedate//orderby排序的条件是filechild.filedate
select fileschild;//选择导出到DateOrder容器中的数据是 filechild
int times = filenames.Length;
ArrayList resultlist = new ArrayList();
//强类型必须使用foreach历遍容器中的元素,如List<>\var\ArrayList<>等
foreach (filewithdate s in DateOrder)//按指定的日期区间筛选文件
{
int derstrat = string.Compare(s.filedate, Dstart);
int derend = string.Compare(s.filedate, Dend);
if (derstrat >= 0 && derend <= 0)
{
resultlist.Add(s.filename);
}
}
FileTool.filenames = (string[])resultlist.ToArray(typeof(string));
if (FileTool.filenames.Length != 0 && !Array.Exists(FileTool.filenames, string.IsNullOrEmpty))
{
FileInfo fs = new FileInfo(FileTool.filenames[0]); FileInfo fs_last = new FileInfo(FileTool.filenames[FileTool.filenames.Length - 1]);
FileTool.date = fs.Name.Replace(fs.Extension, "").Substring(fs.Name.Replace(fs.Extension, "").Length - LastTo, SelectLength) + "_" + fs_last.Name.Replace(fs_last.Extension, "").Substring(fs_last.Name.Replace(fs_last.Extension, "").Length - LastTo, SelectLength);
}
return FileTool;
}
/// <summary>
/// 文件按创建日期筛选器
这是一个将输入的文件流按文件的创建时间筛选的方法,其原理和算法与上一个方法异曲同工。
/// </summary>
/// <param name="filenames"></param>
/// <param name="Dstart"></param>
/// <param name="Dend"></param>
/// <returns></returns>
public static string[] FileSelectByCreationDate(string[] filenames, string Dstart, string Dend)
{
IEnumerable filelist = filenames.Where(p => File.GetCreationTime(p) >= DateTime.Parse(Dstart) && File.GetCreationTime(p) <= DateTime.Parse(Dend));
ArrayList files = new ArrayList();
foreach (string filename in filelist)
{
files.Add(filename);
}
string[] s = new string[files.Count];
files.CopyTo(s);
return s;
}
/// <summary>
/// 合并文件
/// </summary>
/// <param name="Source"></param>//源文件的存放目录
/// <param name="patterns"></param>//待查找文件的类型"*.txt"等,详见Directory.GetFiles()方法
/// <returns></returns>
public static string[] MergeFilenames(string Source, string[] patterns)
{
ArrayList filenames_ = new ArrayList();
foreach (string pattern in patterns)
{
filenames_.AddRange(Directory.GetFiles(Source, pattern, SearchOption.AllDirectories));
}
string[] filenames = (string[])filenames_.ToArray(typeof(string));
return filenames;
}
/// <summary>
/// 按创建日期的多文件合并排序与筛选方法
/// </summary>
/// <param name="Source"></param>
/// <param name="patterns"></param>
/// <param name="Dstart"></param>
/// <param name="Dend"></param>
/// <returns></returns>
public static string[] FileWithCreationDate(string Source, string[] patterns, string Dstart, string Dend)
{
string[] filenames ={};
filenames = MergeFilenames(Source, patterns);
if (!FilesJudge(Source)) return filenames;
string[] resultfilenames ={};
if (Array.Exists(filenames, string.IsNullOrEmpty))
{
filenames = fileoperation.FileSelectByCreationDate(filenames, Dstart, Dend);
ArrayList boottle = new ArrayList();
foreach (string file in filenames)
{
FileInfo fi = new FileInfo(file);
boottle.Add(fi.Name.ToString()+"\t"+fi.CreationTime.ToString("yyyy-MM-dd"));
}
resultfilenames = (string[])boottle.ToArray(typeof(string));
}
return resultfilenames;
}
/// <summary>
/// 字符串数组合并方法
附上可能需要用到的方法
/// </summary>
/// <param name="str1[]"></param>
/// <param name="str2[]"></param>
/// <returns></returns>
public static string[] StrsExtension(string[] str1,string[] str2)
{
ArrayList str = new ArrayList();
str.AddRange(str1);
str.AddRange(str2);
string[] resultstr = (string[])str.ToArray(typeof(string));
return resultstr;
}