FilePrefixList.Any(s => FileName.StartsWith(s))
Можно ли получить значение s здесь? Я хочу отобразить согласованную строку.
FilePrefixList.Any(s => FileName.StartsWith(s))
Можно ли получить значение s здесь? Я хочу отобразить согласованную строку.
Any определяет только, если есть совпадение, оно не возвращает ничего, кроме bool, и ему нужно выполнить запрос.
Вы можете использовать Where или First/FirstOrDefault:
string firstMastch = FilePrefixList.FirstOrDefault(s => FileName.StartsWith(s)); // null if no match
var allMatches = FilePrefixList.Where(s => FileName.StartsWith(s));
string firstMastch = allMatches.FirstOrDefault(); // null if no match
Итак, Any отлично, если все, что вам нужно знать, это совпадение, иначе вы можете использовать FirstOrDefault для получения первого соответствия или null (в случае ссылочных типов).
Так как Any должен выполнить запрос, это менее эффективно:
string firstMatch = null;
if(FilePrefixList.Any(s => FileName.StartsWith(s)))
{
// second execution
firstMatch = FilePrefixList.First(s => FileName.StartsWith(s));
}
Если вы хотите поместить все совпадения в отдельную коллекцию, например, List<string>:
List<string> matchList = allMatches.ToList(); // or ToArray()
Если вы хотите вывести все совпадения, вы можете использовать String.Join:
string matchingFiles = String.Join(",", allMatches);
Не с Any, no..., который предназначен только для определения наличия совпадений, поэтому он возвращает bool. Однако вы можете использовать FirstOrDefault вместо предиката:
var match = FilePrefixList.FirstOrDefault(s => FileName.StartsWith(s));
if (match != null)
{
// Display the match
}
else
{
// Nothing matched
}
Если вы хотите найти все совпадения, используйте Where вместо этого.
если FilePrefixList является List<string>, вы можете использовать метод List<T>.Find:
string first = FilePrefixList.Find(s => FileName.StartsWith(s));
скрипт: List.Find vs LINQ (поиск быстрее)
List<T>.Find(MSDN) возвращает первый элемент, который соответствует условиям, определенным указанным предикатом, если он найден; в противном случае значение по умолчанию для типа T
Enumerable.Any() возвращает bool, указывая, соответствует ли какой-либо элемент критериям.
Если вам нужен соответствующий элемент, вместо SingleOrDefault() используйте SingleOrDefault():
var matchedPrefix = FilePrefixList.SingleOrDefault(s => FileName.StartsWith(s));
См. MSDN
пожалуйста, проверьте это: мы предполагаем, что FilePrefixList является списком коллекции
class A
{
public int ID { get; set; }
public string Name { get; set; }
}
List<A> FilePrefixList= new List<A>();
FilePrefixList.Add(new A
{
ID = 1,
Name = "One"
});
FilePrefixList.Add(new A
{
ID =2,
Name = "Two"
});
FilePrefixList.Add(new A
{
ID = 3,
Name = "Three"
});
выберите данные из списка:
var listItems = FilePrefixList.Where(x =>x.Name.StartsWith("T")).ToList();