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();