Im совершенно новый для C#, поэтому попытка протестировать простой строковый фильтр, но не получить желаемые результаты. Это мой метод испытания:Возврат списка, отфильтрованного на основе другого списка в C#
[TestMethod]
public void Test_ExceptFilter()
{
IEnumerable<string> allnames = new List<string>(){"Thumbs.db","~","one","two exe here","three"};
var u = FileLister.GetFilteredList(allnames, new [] { "thumbs","~"}, false);
}
У меня есть статический класс с именем FileLister, который имеет метод GetFilteredList, и бит, который не работает, когда я пытаюсь вернуть список, который не содержит никаких строки, которые находятся во втором IEnumerable.
Так что в моем примере здесь я ожидаю, что var u будет иметь «один», «два exe здесь» и «три», но в нем есть все элементы из списка allnames !.
Это различные способы, которые я попробовал, и во всех из них, часть им борется с где булевы includewords передается как ложная:
//Return strings that contain or dont contain any element in the array
public static IEnumerable<string> GetFilteredList(IEnumerable<string> myfiles,
IEnumerable<string> filterbythesewords, bool includewords)
{
if (includewords)
{
return from line in myfiles
where filterbythesewords.Any(item => line.Contains(item))
select line;
}
else
{
return from line in myfiles
where filterbythesewords.Any(item => !line.Contains(item))
select line;
}
}
ВТОРОЙ СУДЕБНОГО
//Return strings that contain or dont contain any element in the array
public static IEnumerable<string> GetFilteredList(IEnumerable<string> myfiles,
IEnumerable<string> filterbythesewords, bool includewords)
{
if (includewords)
{
return from line in myfiles
where filterbythesewords.Any(item => line.Contains(item))
select line;
}
else
{
List<string> p = new List<string>();
p.AddRange(myfiles.Except(filterbythesewords));
return p;
}
}
ТРЕТИЙ СУД
//Return strings that contain or dont contain any element in the array
public static IEnumerable<string> GetFilteredList(IEnumerable<string> myfiles,
IEnumerable<string> filterbythesewords, bool includewords)
{
if (includewords)
{
return from line in myfiles
where filterbythesewords.Any(item => line.Contains(item))
select line;
}
else
{
return myfiles.Where(file => filterbythesewords.Any(x => !file.ToUpperInvariant().Contains(x.ToUpperInvariant())));
}
}
Как я могу сделать эту работу, пожалуйста? В конечном счете, я хочу, чтобы иметь возможность фильтровать имена файлов из списка каталогов на основе их расширений файлов или части их имен.
веселит
Если вы только боретесь с половиной этого, то другая половина не имеет значения. Я предлагаю вам уменьшить свой вопрос до * только * той части, с которой у вас возникают проблемы. Чем меньше нерелевантных частей есть вопрос, тем лучше. –
'return myfiles.Where (file => filterbythesewords.All (x =>! File.ToUpperInvariant(). Содержит (x.ToUpperInvariant())));' –