2015-03-04 4 views
1

У меня есть класс, как так:Поиск массива с петлей Еогеаспа и получить индекс элемента

public class MyClass 
{ 
    public char letter { get; set; } 
    public double result { get; set; } 
    public bool test { get; set; } 
} 

Я объявляю массив:

MyClass[] myArray = new MyClass[counter]; 

и заполнить его с некоторыми данными.

сортировать массив:

myArray = myArray.OrderBy(a => a.letter).ThenByDescending(a => a.result).ToArray(); 

Теперь, скажем, у меня есть int i = 100 переменные.

Как бы я перебирать этот массив полей и получить индекс первого элемента, который:

  1. указавшего письмо в письме поле.
  2. Имеет test == false
  3. result < i

Я имею в виду что-то вроде этого:

foreach(MyClass t in myArray.Where(a => a.letter == 'a') 
{ 
    if(t.result < i && t.test == false) get index of that field 
} 

Однако я не уверен, как получить индекс его. Как мне это сделать?

+1

Прежде всего, символ не может содержать ** другой символ.ither свойство имеет тип 'string' или ** содержать ** выражение должно быть ** равно ** – user3021830

+0

Если вам нужен индекс, вы должны сделать' for' вместо 'foreach' и выполнить фильтрацию внутри' for 'с' if'. – juharr

ответ

4

Array.FindIndex должны решить эту проблему для вас:

int correctIndex = Array.FindIndex(myArray , item => item.letter == 'a' && item.result < i && !item.test); 

Второй параметр функционально эквивалентен, как бы вы описали его в статье .Where().

Также, как и аналогичные функции индексирования, он возвращает -1, если элемент не найден.

2

Вы можете сделать это с помощью перегрузки Select, который обеспечивает индекс, например:

var res = myArray 
    .Select((val, ind) => new {val, ind})) 
    .Where(p => p.val.result < i && p.val.letter == 'a' && !p.val.test) 
    .Select(p => p.ind); 

Первые Select пары до MyClass объектов, а val с их индексом, а ind. Затем метод Where выражает три условия, в том числе пары result и ind. Наконец, последний Select сбрасывает объект MyClass, потому что он больше не нужен.

+0

Из вопроса OP я предполагаю, что переменная 'i' * не является индексом *, а только заданным значением фильтра. – Flater

+0

Это, если мне нужно будет это сказать, я бы сказал: найдите мне индекс первого элемента в массиве, который имеет букву a, test == false и результат меньше i. – Januszoff

+0

@Januszoff Я думаю, что вы правы, это должно быть исправлено. – dasblinkenlight

0

Без foreach:

var item = myArray.FirstOrDefault(e => e.letter == 'a' && e.result < i && e.test == false); 
int index = Array.IndexOf(myArray, item); 
1

Я вижу, что ребята уже проделали большую работу, отвечая на ваш вопрос с лучшей альтернативой, но только в том случае, если вы все еще хотите знать, как сделать это с для каждого, вот как

int counter = 5 ; // size of your array 
int i = 100 ; // the limit to filter result by 
int searchResult = -1; // The index of your result [If exists] 
int index = 0; // index in the array 

MyClass[] myArray = new MyClass[counter]; // Define you array and fill it 
myArray[0] = new MyClass {letter = 'f' ,result = 12.3 , test = false } ; 
myArray[1] = new MyClass {letter = 'a' ,result = 102.3 , test = true} ; 
myArray[2] = new MyClass {letter = 'a' ,result = 12.3 , test = false } ; 
myArray[3] = new MyClass {letter = 'b' ,result = 88 , test = true } ; 
myArray[4] = new MyClass { letter = 'q', result = 234, test = false }; 

myArray = myArray.OrderBy(a => a.letter).ThenByDescending(a => a.result).ToArray(); // Sort the array 

foreach(MyClass t in myArray.Where(a => a.letter == 'a')) // The foreach part 
{ 
    if (t.result < i && t.test == false) 
    { 
     searchResult = index; 
     break; 
    } 
    index++; 
} 

// And finally write the resulting index [If the element was found] 
  • Обратите внимание: конечно, полученный индекс будет индекс в отсортированном массиве
Смежные вопросы