Список пошуку <T>

I have a List containing file paths. How can I check if there is a particular file in my list e.g. file.txt? Preferably a method returning not a bool value but list element or element's index.

I've read the List documentation but it only confused me as I'm a beginning programmer and my English isn't very good.

1
додано Автор CodeCaster, джерело
list.Find (item => item.Contains ("file.txt"));
додано Автор Gopesh Sharma, джерело

7 Відповіді

Використовуйте Де , щоб отримати список значень:

      var found = fileList.
            Where((f)=>System.IO.Path.GetFileName(f)
                                  .Equals(SEARCH_VALUE, 
                                   StringComparison.InvariantCultureIgnoreCase)); 

або використовуйте FirstOrDefault для окремих елементів або null у випадку, якщо це не знайдено

8
додано
@downvoter: причина
додано Автор Tigran, джерело
@Jodrell: хороший момент, змінений на Де дзвінок, так ОР отримує список результатів.
додано Автор Tigran, джерело
чи не так ясно?! :-p
додано Автор Jodrell, джерело
і це чітко вказує в питанні, що ОП хотів би мати список матчів чи показників.
додано Автор Jodrell, джерело
можливо, це чутливість до справи, однак я не можу прочитати думки.
додано Автор Jodrell, джерело
На жаль, не ясно, але навіть неправильно. Я відредагував своє питання. Вибачте
додано Автор Przeszczep, джерело

Якщо ваш список містить повний шлях (наприклад, c: \ windows \ system.ini), я б мав використовувати System.IO.Path.GetFileName , а також майте на увазі пошук інтенсивного випадку

var result = from f in files
             where Path.GetFileName(f).Equals("file.txt",
                   StringComparison.InvariantCultureIgnoreCase)
             select f;

bool found = result.Any();
2
додано

Метод IndexOf - це те, що вам потрібно якщо ви хочете знайти шлях, який точно спостерігає за тим, що ви шукаєте.

Однак, якщо ви хочете знайти шляхи у своєму списку, який закінчується певним ім'ям файлу, ви можете зробити це,

var matches = paths.Select((path, i) => new { Path = path, Index = i })
    .Where(item => Path.GetFileName(item.Path).Equals(
        "file.txt",
        StringComparison.OrdinalIgnoreCase));

Однак зауважте, що matches буде послідовністю з 0 або більше збігів. Отже, ви можете зробити

if (matches.Any())
{
   //I found something.
    foreach (var match in matches)
    {
       var matchIndex = match.Index;
       var matchPath = match.Path;
    }
}
else
{
   //Oops, no matches.
}

або, якщо ви тільки хочете першого.

var firstMatchPath = matches.First().Path;

зробив би.

2
додано
Невірний Це також знайде "myfile.txt"!
додано Автор Jürgen Steinblock, джерело
@SchlaWiener, правильно, +1 для вас
додано Автор Jodrell, джерело

Якщо ви просто хочете перше значення, якщо є таке, ви можете це зробити.

var value = mylist.FirstOrDefault(x=>x.EndsWith("file.txt"));

або якщо ви хочете щось зробити з кожним відповідним рядком.

foreach (string value in mylist.Where(x=>x.EndsWith("file.txt")) )
{
   //Do whatever you intend with value.
}

або якщо ви хочете перелік індексів значень, то ви можете спробувати це.

var indexValues = new List();
foreach (string value in mylist.Where(x=>x.EndsWith("file.txt")) )
{
    indexValues.Add(mylist.IndexOf(value));
}
1
додано
На жаль, питання полягає в тому, якщо в імені рядка вказано ім'я файлу. Спасибі, змінилося, щоб відповісти на питання.
додано Автор James, джерело
@ ДжонсКовдаль забув про це, дякую.
додано Автор James, джерело
Невірний, знайдеться також "myfile.txt".
додано Автор Jürgen Steinblock, джерело
Він не буде компілюватися через відсутність).
додано Автор Sayse, джерело
Це призведе до аварії, якщо його там немає?
додано Автор Johny Skovdal, джерело

Використовуйте LINQ (якщо ви маєте шляхи як рядки):

var found = from f in fileList where f.equals("file.txt") select f; 
1
додано
Я не зменшився - це лише натяк.
додано Автор Jürgen Steinblock, джерело
Цей файл не знайде "File.txt", також ви змішали f і n
додано Автор Jürgen Steinblock, джерело
@ SchlaWiener причиною змішаних n і f або з якоїсь іншої причини?
додано Автор CloudyMarble, джерело

З вашого запитання незрозуміло, але, схоже, список міститиме шляхи до файлів, але те, що ви шукаєте, - це ім'я файлу.

Наступний код дасть вам індекс першого виникнення файлу з назвою "file.txt" у списку назв шляху або -1, якщо він відсутній у списку.

Зверніть увагу, як це використовує Path.GetFileName() . Це так, що він буде відповідати "c: \ dir1 \ dir2 \ file.txt", а не "c: \ dir1 \ dir2 \ wrongfile.txt".

int index = filenames.FindIndex(filename => Path.GetFileName(filename).Equals("file.txt", StringComparison.OrdinalIgnoreCase));

Однак, якщо ви шукаєте весь шлях, ви можете зробити це так:

int index = filenames.FindIndex(filename => filename.Equals("file.txt", StringComparison.OrdinalIgnoreCase));

Зверніть увагу, як ми робимо порівняння всього імені файлу, а не "EndsWith".

Якщо імена файлів вже є всіма рядками, і ви порівнюєте всі шляхи, ви можете зробити простий пошук:

int index = filenames.IndexOf("file.txt");

Або якщо вони всі великі, то вам доведеться робити:

int index = filenames.IndexOf("FILE.TXT");
0
додано

Враховуючи, що у вас є шлях і ім'я файлу розташовано в кінці шляху:

        //List of elements
        List foundElements = myInitialList.Where(s => s.EndsWith("file.txt")).ToList();

        //List of Indexes (base on lift of elements here above)
        List indexList = new List();
        foundElements.ForEach(f => indexList.Add(myInitialList.IndexOf(f)));
0
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug