Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ筛选字符串[]?_C#_.net_Arrays_Linq_Filter - Fatal编程技术网

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,我现在明白了,你真正想要的是我回答的后半部分。