如何使用LINQ过滤字符串[]?

时间:2015-08-07 12:44:37

标签: 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 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。但我仍然很好奇你如何根据包含其他值的值过滤字符串集合。

3 个答案:

答案 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 这就是匿名类型到字符串转换失败的原因..