C# 如何使用LINQ筛选字符串[]?
我有以下代码:C# 如何使用LINQ筛选字符串[]?,c#,.net,arrays,linq,filter,C#,.net,Arrays,Linq,Filter,我有以下代码: string[] projects = Directory.GetDirectories(dir, "*", SearchOptions.TopDirectoryOnly); string[] issues = Directory.GetFiles(dir, "*.txt", SearchOptions.AllDirectories) foreach (string project in projects) { var filteredIssues = from fi
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
}
}
但这不会编译,并给我以下错误:
无法将类型“AnonymousType1”转换为“string”
我在看这个例子:
因此,这个问题:
但我并不确定在这种特殊情况下uid是什么,也不知道如何将解决方案应用于我的问题
我也试过了
var filteredIssues = issues.Select(x => x.Contains(project)).ToArray();
但这会返回一系列布尔值
dir指向一个项目文件夹,该文件夹将包含N个唯一命名的文件夹。那里的每个文件夹都将包含一个活动和存档文件夹,其中包含问题所包含的文本文件,而我实际上只是尝试在项目基础上筛选问题,将其加载到按项目分组的UI中
最终,我想要与此SQL语句等效的LINQ:
SELECT issue FROM issues WHERE issue LIKE '%project%'
虽然现在在写这篇文章的时候,我意识到我只需要在第一个foreach循环中而不是在外部执行string[]issues=Directory.GetFilesproject、*.txt、SearchOptions.AllDirectories。但我仍然很好奇如何根据包含另一个值的值筛选字符串集合。我认为您应该试试这个
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而不是选择new{f=fi};
哪里
select new{f=fi}是匿名类型,字符串属性名为f
这就是匿名类型到字符串转换失败的原因。您实际需要的是不在顶级目录中的文本文件
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;
}
您可以使用Where来筛选集合。像这样:
var filteredIssues = issues.Where(x => x.Contains(project)).ToArray()
选择用于将一个IEnumerbale投影到另一个IEnumerbale。像映射一样,您可以选择映射到目标类型的内容 在FilterDissues{Console.WriteLineissue.f;}中尝试foreachvar问题。很少有一个匿名类型只有一个属性。因此,您可以说select FIABOUT:var filteredIssues=issues.Wherex=>x.Containsproject.ToArray;,而不是选择新的{f=fi}@丹尼斯:谢谢,我对林克一点经验都没有,所以我不知道我能做到。@SimonGates这似乎行得通,如果你想把它作为一个答案发布,那么我可以接受它并结案。我不完全确定你的意思。另外,我可能还不清楚,我应该说我只是试图过滤路径包含项目的问题,而不是文件名本身。因此,最终如果我有ProjectA和ProjectB,问题可能包含../ProjectA/Active/123.txt和../ProjectB/Archived/456。txt@sab669,我现在明白了,你真正想要的是我回答的后半部分。