vishal_h Ответов: 2

как получить индекс элемента списка в C#


Я хочу найти индекс элемента списка, возраст которого равен 20 ..как я могу получить его с помощью метода indexOf() списка...теперь в этом случае его индекс равен 3...но как его найти и отобразить...
public class Person
   {
       public string Name { get; set; }
       public int Age { get; set; }
       public string Country { get; set; }
       public string EmailId { get; set; }
       public DateTime JoinedOn { get; set; }
   }

ObservableCollection<person> myList = new ObservableCollection<Person>()
           {
               new Person{ Name="Person 1", Age=21, Country="India",  EmailId="some@some.com", JoinedOn=DateTime.Now},
               new Person{ Name="Person 2", Age=29, Country="India",  EmailId="some@some.com", JoinedOn=DateTime.Now},
               new Person{ Name="Person 3", Age=20, Country="India",  EmailId="some@some.com", JoinedOn=DateTime.Now},
               new Person{ Name="Person 4", Age=22, Country="India",  EmailId="some@some.com", JoinedOn=DateTime.Now},
               new Person{ Name="Person 5", Age=23, Country="India",  EmailId="some@some.com", JoinedOn=DateTime.Now},

           };
</person>

2 Ответов

Рейтинг:
5

UJimbo

Сделать цикл foreach по списку элементов :

private void LookForPerson() 
{
   ObservableCollection<Person> myList = new ObservableCollection<Person>()
   {
      new Person{ Name="Person 1", Age=21, Country="India",  EmailId="some@some.com", JoinedOn=DateTime.Now},
      new Person{ Name="Person 2", Age=29, Country="India",  EmailId="some@some.com", JoinedOn=DateTime.Now},
      new Person{ Name="Person 3", Age=20, Country="India",  EmailId="some@some.com", JoinedOn=DateTime.Now},
      new Person{ Name="Person 4", Age=22, Country="India",  EmailId="some@some.com", JoinedOn=DateTime.Now},
      new Person{ Name="Person 5", Age=23, Country="India",  EmailId="some@some.com", JoinedOn=DateTime.Now},
 
   };

   int n = -1;
   foreach (Person item in myList)
   {
      if (item.Age == 20)
      {
          n = myList.IndexOf(item);
          break;
      }
   }        
}


Индекс будет равен 2, так как элементы хранятся в списке как 0,1,2,3 и т. д.


Manfred Rudolf Bihy

Мой 4!
Близко, но не совсем там. Что происходит в вашем коде, если есть более одного человека в возрасте двадцати лет?

UJimbo

Я использую только этот случай, как и просил ОП :)

Manfred Rudolf Bihy

Все еще не делает того, что хотел ОП. Вы устанавливаете n равным нулю, что будет допустимым индексом. Поэтому, когда не будет найдено ни одного человека в возрасте двадцати лет, ваш код будет предполагать, что первая запись в списке подойдет.
По крайней мере, установите n в недопустимое число для индекса, например -1.

Manfred Rudolf Bihy

Теперь выглядит лучше! У меня 5!

vishal_h

Я пытаюсь это сделать, но он дает мне nullReferenceException и предупреждает меня использовать новое ключевое слово..
если я использовал new like Person item=new Person()...то это дает ошибку в строке foreach(item in MyList)....что мне делать сэр

UJimbo

Используя свой класс Person, попробуйте использовать приведенную выше функцию, n будет равно 2 в конце

UJimbo

человек должен быть человеком при определении ObservableCollection, по какой-то причине код страницы помечает его как html-тег, а затем пытается закрыть его в конце. Вероятно ошибка в веб странице

BobJanova

Я отредактировал ваше решение, чтобы параметры универсального типа не боролись с HTML-тегами.

UJimbo

Спасибо, боб, в какой-то момент мне нужно попасть на rtfm

Рейтинг:
17

Manfred Rudolf Bihy

Если вы всегда хотите получить только один результат сделайте это:

Person agedTwenty = myList.Where<Person>( x => return x.Age == 20; ).Single<Person>();
int index = myList.IndexOf(agedTwenty);

или альтернативно
int index = myList.Where<Person>( x => return x.Age == 20; ).Select<Person,int>( x => myList.IndexOf(x)).Single<int>();


В случае если может быть более одного результата вы бы сделали это:
IEnumerable<Person> allAgedTwenty = myList.Where<Person>( x => return x.Age == 20; );
IEnumerable<int> indices = allAgedTwenty.Select<Person,int>( x => myList.IndexOf(x) );


В первом случае вы получите только один int, а во втором - список int.

с уважением,

- МРБ


fjdiewornncalwe

Вы получите мою пятерку за то, что побудили ОП использовать LINQ для этой цели.

Manfred Rudolf Bihy

Спасибо Маркус,
Я только недавно начал использовать LinQ с тех пор, как мы совсем недавно перешли от .NET 2.0 к 4.0. Должен сказать, что мне это нравится. Это так потрясающе в выражении комбинаций, преобразований и фильтрации. Код, который раньше занимал от 10 до 15 строк, может быть легко выражен в 2-3 строках. И как только вы привыкнете к синтаксису, он уже не будет таким загадочным. :)

BobJanova

5 для хорошего и надлежащего использования LINQ.

[no name]

Хорошо и ясно, мой 5!