List.Any получить соответствие String
FilePrefixList.Any(s => FileName.StartsWith(s))
Можно ли получить значение s
здесь? Я хочу отобразить согласованную строку.
Ответы
Ответ 1
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);
Ответ 2
Не с Any
, no..., который предназначен только для определения наличия совпадений, поэтому он возвращает bool
. Однако вы можете использовать FirstOrDefault
вместо предиката:
var match = FilePrefixList.FirstOrDefault(s => FileName.StartsWith(s));
if (match != null)
{
// Display the match
}
else
{
// Nothing matched
}
Если вы хотите найти все совпадения, используйте Where
вместо этого.
Ответ 3
если FilePrefixList
является List<string>
, вы можете использовать метод List<T>.Find
:
string first = FilePrefixList.Find(s => FileName.StartsWith(s));
скрипт: List.Find vs LINQ (поиск быстрее)
List<T>.Find
(MSDN) возвращает первый элемент, который соответствует условиям, определенным указанным предикатом, если он найден; в противном случае значение по умолчанию для типа T
Ответ 4
Enumerable.Any()
возвращает bool
, указывая, соответствует ли какой-либо элемент критериям.
Если вам нужен соответствующий элемент, вместо SingleOrDefault()
используйте SingleOrDefault()
:
var matchedPrefix = FilePrefixList.SingleOrDefault(s => FileName.StartsWith(s));
См. MSDN
Ответ 5
пожалуйста, проверьте это:
мы предполагаем, что 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();