要获取文件的详细信息,Directory.Getfiles(“DirectoryPath”,“* .zip”)将返回目录中的所有文件。每个文件在文件名中都有一个DateTime标记作为后缀:
e.g。 {87fbf03b-ec94-44a0-aac5-ffbaf6416700} _20100204_145154634008919142146021.zip
我从上面的文件名中拆分GUID。
string filName = Path.GetFileNameWithoutExtension(testFile).Split('_')[0];
这个解释只是告诉大家,那就是我如何在同一目录中拥有多个同名文件。
现在我的问题是如何在T-SQL中获得与Group by query相同的结果?我需要知道该目录中有多少次类似的文件名。
通过linq可以吗?是的,怎么样?
答案 0 :(得分:2)
当然,请使用Enumerable.GroupBy
:
var groups = from f in Directory.GetFiles("DirectoryPath", "*.zip")
group f by f.Split('_')[0] into g
select new {
GUID = g.Key
Count = g.Count()
};
foreach(var group in groups) {
Console.WriteLine("Guid = {0}: Count = {1}", group.GUID, group.Count);
}
它读得非常好。
由于您在评论中指定不能使用LINQ:
Dictionary<string, int> dict = new Dictionary<string, int>();
foreach(string filename in Directory.GetFiles("DirectoryPath", "*.zip")) {
string guid = filename.Split('_')[0];
if(!dict.ContainsKey(guid)) {
dict.Add(guid, 0);
}
dict[guid]++;
}
foreach(KeyValuePair<string, int> kvp in dict) {
Console.WriteLine("Guid = {0}: Count = {1}", kvp.Key, kvp.Value);
}
答案 1 :(得分:1)
试试这个(未经测试):
IList<string> fileNames = ...
var result = from fileName in fileNames
group fileName by fileName.Split('_')[0] into grp
select new
{
FileName = grp.Key,
Count = grp.Count()
};
答案 2 :(得分:1)
而不是字符串,你应该使用Guid类型。
var groups = from f in System.IO.Directory.GetFiles("DirectoryPath", "*.zip")
group f by f.Split('_')[0] into g
select new
{
GUID = new Guid(g.Key),
Count = g.Count()
};