我有以下代码:
string[] projects = Directory.GetDirectories(dir, "*", SearchOptions.TopDirectoryOnly);
string[] issues = Directory.GetFiles(dir, "*.txt", SearchOptions.AllDirectories)
foreach (string project in projects)
{
var filteredIssues = from fi in issues where fi.Contains(project) select new { f = fi };
foreach(string issue in filteredIssues)
{
// do something
}
}
但这不会编译并给我以下错误:
无法转换类型' AnonymousType#1'到'字符串'
我在看这个例子:http://www.dotnetlearners.com/linq/linq-to-string-array-with-example.aspx
这个问题:How do I use LINQ Contains(string[]) instead of Contains(string)
但我不确定uid
在该特定情况下是什么,或者如何将解决方案应用于我的问题。
我也试过
var filteredIssues = issues.Select(x => x.Contains(project)).ToArray();
但是这会返回一系列布尔。
dir
指向"项目"包含N个唯一命名文件夹的文件夹。每个文件夹都包含一个" Active"和#34;存档"包含许多文本文件的文件夹(issues
包含的内容,我实际上只是尝试按项目过滤issues
以将其加载到按项目分组的UI中)
最终我希望LINQ等效于这个SQL语句:
SELECT issue FROM issues WHERE issue LIKE '%project%'
虽然我现在正在写这篇文章,但我意识到我只能在第一个string[] issues = Directory.GetFiles(project, "*.txt", SearchOptions.AllDirectories)
循环内而不是在外面进行foreach
。但我仍然很好奇你如何根据包含其他值的值过滤字符串集合。
答案 0 :(得分:3)
您真正想要的是不在顶级目录中的文本文件。
var projects = Directory.GetDirectories(dir, "*", SearchOptions.TopDirectoryOnly);
var issues = projects.SelectMany(p =>
Directory.EnumerateFiles(p, "*.txt", SearchOptions.AllDirectories));
foreach(var issue in issues)
{
// Do something;
}
答案 1 :(得分:3)
您可以使用Where过滤集合。像这样:
var filteredIssues = issues.Where(x => x.Contains(project)).ToArray()
选择是将一个IEnumerbale<Type>
投射到另一个IEnumerbale<Type2>
。把它想象为Mapping,你可以选择映射到目标类型的内容。
答案 2 :(得分:2)
我认为你应该试试这个。
string[] projects = Directory.GetDirectories(dir, "*", SearchOptions.TopDirectoryOnly);
string[] issues = Directory.GetFiles(dir, "*.txt", SearchOptions.AllDirectories)
foreach (string project in projects)
{
var filteredIssues = from fi in issues where fi.Contains(project) select fi;
foreach(string issue in filteredIssues)
{
// do something
}
}
你应该选择fi而不是选择新的{f = fi}; 哪里 选择新的{f = fi} 是匿名类型,字符串属性名称为 f 这就是匿名类型到字符串转换失败的原因..