2014-11-05 5 views
0

Я создал класс под названием studentRecord и содержит несколько свойств, таких как Student Number, First Name, Last Name, Courses, and Credit Hours для отслеживания отдельных записей учащихся. Я также создал list под названием List<studentRecord> lstRecords = new List<studentRecord>();, в котором хранятся различные объекты (учащиеся).C# Как получить доступ к определенному индексу списка классов

Я понимаю, что добавление объекта student осуществляется с помощью lstRecords.Add();, но я столкнулся с проблемой редактирования объектов. Предполагается, что пользователь сможет ввести номер студента, а затем иметь возможность доступа и редактирования свойств этого конкретного экземпляра объекта. Я пришел с этим кодом:

StudentRecord editRecord = lstRecords.Find(indexRecord => 
        indexRecord.intStudentNumber == intChosenRecord); 

(Кстати, intChosenRecord переменным я объявил отслеживать, какой индекс они ищут)

Я понимаю, что StudentRecord объявляет новый объект этого типа, и что editRecord - это имя моего нового объекта. Однако у меня возникают проблемы с использованием метода .Find(). Я понимаю, что .Find() ищет в своем списке что-то, которое совпадает со входом. Поэтому я предполагаю, что intChosenRecord - это то, что ищет программа.

Однако я не знаю, что такое indexRecord! Это единственный раз, когда он используется в коде, и я могу изменить его на любое имя, которое я хочу без ошибок. Может кто-нибудь объяснить, что делает этот код, и что такое indexRecord?

+0

это просто псевдоним для элемента в настоящее время обрабатываются в пределах вашего LINQ-выражения. Его также можно назвать SuperMan. Таким образом, все это просто означает: найти все элементы (назовем их indexRecord), которые заполняют условие. – HimBromBeere

+0

Существует отличный пример на http://msdn.microsoft.com/en-us/library/x0b5b5bc(v=vs.110).aspx – Florian

+0

Возможный дубликат [Что делает этот код C# со значком «стрелка» и как это называется?] (http://stackoverflow.com/questions/4829054/what-does-this-c-sharp-code-with-an-arrow-mean-and-how-is-it-called) –

ответ

0

«indexRecord» - это переменная, которая соответствует каждому учащемуся в списке. «Найти» останавливает и возвращает текущего ученика, когда условие (или «предикат») справа от «=>» истинно. Поэтому вы можете назвать его как угодно, до тех пор, пока вы используете то же имя, слева и справа от «=>»

Подобный цикл может быть:

StudentRecord editRecord = null; 

foreach(var indexRecord in lstRecords) 
{     
    if(indexRecord.intStudentNumber == intChosenRecord)) 
    { 
     editRecord = indexRecord; 
     break; // Exits the loop. 
    } 
} 

Этот код не очень чистый , но я даю его для ясности, поскольку он делает то же самое, что и ваш, с циклом «oldschool», который, безусловно, более знаком вам.

См. http://msdn.microsoft.com/fr-fr/library/bb397687.aspx для получения более подробной информации об этом синтаксисе. И http://msdn.microsoft.com/fr-fr/library/bb397926.aspx для других методов, чем «Найти».

+0

О, это имеет смысл. Благодаря! –

0

indexRecord является аргументом выражения лямбды. Он может иметь любое имя, которое вы хотите. В вашем случае, это представляет собой StudentRecord (элемент вашего списка)

вы можете легко изменить ваш код:

StudentRecord editRecord = lstRecords.Find(x => x.intStudentNumber == intChosenRecord); 

Вы можете узнать больше о лямбда-выражения на многих сайта, а http://www.dotnetperls.com/lambda

0

Переменная editRecord относится к совпадению, возвращенному Find(), поэтому оно не создает новый объект или новый экземпляр чего-либо; это относится к существующему экземпляру.

Придумайте indexRecord в качестве идентификатора используется для перебора всех элементов в коллекции, например, когда вы говорите:

var numbers = new List<int>(); 
foreach (var n in numbers) 
{ 
    // do something with n 
} 

Вы можете заменить п, или indexRecord с любым идентификатором вам нравится.

0

Когда вы используете «=>», вы используете lambda expression.

В вашем случае «indexRecord» является именем переменной входного параметра для вашего выражения лямбда «indexRecord.intStudentNumber == intChosenRecord». И indexRecord соответствуют учащемуся, сохраненному в вашем списке.

Я бы предположил, что вы знакомы с лямбда-выражениями, потому что это мощная и распространенная функция C#.

+0

Спасибо за это! Это помогает много –

0

попробовать это ..

List<int> idlist=lstRecords.select(t=>t.intStudentNumber).toList(); 
int index=idlist.indexof(intChosenRecord); 
studentRecord record=lstRecords[index]; 

я всегда использую это ...

+0

Этот ответ автоматически помечен как низкокачественный, потому что нет объяснения кода и его можно удалить. Пожалуйста, добавьте объяснение. – nalply

Смежные вопросы