2015-08-07 2 views
3

У меня есть следующий код:Как фильтровать строку [] с помощью LINQ?

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 
    } 
} 

Но это не компилируется и дает мне следующую ошибку:

Cannot convert type 'AnonymousType#1' to 'string'

Я смотрел на этот пример: 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(); 

Но что возвращает массив BOOLS.

dir указывает на папку «Проекты», которая будет содержать N уникально названных папок. Каждая папка будет содержать папку «Active» и «Archived», содержащую все текстовые файлы (что и содержит issues, и я просто пытаюсь фильтровать issues на основе Project, чтобы загрузить их в пользовательский интерфейс, сгруппированный по проекту)

в конце концов я хочу LINQ эквивалент этого SQL заявление:

SELECT issue FROM issues WHERE issue LIKE '%project%' 

Хотя сейчас, когда я пишу это, я понимаю, что я просто не могу просто сделать string[] issues = Directory.GetFiles(project, "*.txt", SearchOptions.AllDirectories) внутри первого foreach цикла, а не снаружи. Но мне все еще интересно, как вы можете фильтровать коллекцию строк на основе значений, которые содержат другое значение.

+1

попробуйте 'foreach (var issue в filtersIssues) {Console.WriteLine (issue.f); } ' – Eser

+1

Редко бывает, что анонимный тип имеет только одно свойство. Поэтому вместо 'select new {f = fi}' вы можете сказать 'select fi' –

+2

. Что относительно: var filterIssues = issues.Where (x => x.Contains (project)). ToArray() ;? – SimonGates

ответ

3

Вы можете использовать Где фильтровать коллекцию. Как так:

var filteredIssues = issues.Where(x => x.Contains(project)).ToArray() 

Выберите для проецирования одного IEnumerbale<Type> других IEnumerbale<Type2>. Подумайте об этом, как Mapping, вы можете вишневым выбрать, что отобразить для целевого типа.

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 = ц} анонимный тип с именем строки собственности как х , поэтому анонимный типа для преобразования строки провала ..

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; 
} 
+0

Я не совсем уверен, что вы имеете в виду. Также я мог быть неясен, я должен сказать, что я просто пытаюсь фильтровать 'проблемы', где * путь * содержит Project, а не имя самого файла. Поэтому в конечном итоге, если у меня есть ProjectA и Project B, проблемы могут содержать '../ ProjectA/Active/123.txt' и' ../ ProjectB/Archived/456.txt' – sab669

+0

@ sab669, я вижу, что теперь, что вы на самом деле хочу вторая половина моего ответа. – Jodrell