2015-01-30 2 views
1

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

public class Meeting 
{ 
    public int Id { get; set; } 
    public DateTime Date { get; set; } 
    public bool Selected { get; set; }  
} 

List<Meeting> Meetings 

Используя выражение LINQ, как получить metting встречающийся только перед первым, который выбрано?

Например, в Liste ниже мне нужно, чтобы получить идентификатор собрания 2.

  • Id: 1 Дата: 11/1 отмеченными: ложные
  • Id: 2 Дата: 12/1 Выбрано: ложные
  • Id: 3 Дата: 13/1 отмеченный: правда
  • Id: 4 Дата: 14/1 отмеченный: правда
+0

Итак, вам нужно взять 'Id: 2 Date: 12/1 Selected: false', right? – dasblinkenlight

+0

Это абсолютно правильно – Bronzato

+0

Вы можете использовать 'TakeWhile' ([link] (https://msdn.microsoft.com/en-us/library/vstudio/bb534804)) и' LastOrDefault' ([link] (https: // msdn.microsoft.com/en-us/library/bb504095)), например 'meeting.TakeWhile (meeting => meeting.Selected == false) .LastOrDefault()'. –

ответ

5

Вы можете использовать TakeWhile и LastOrDefault:

var meeting = Meetings.TakeWhile(m => !m.Selected) 
         .LastOrDefault(); 

if (meeting != null) 
{ 
    // Use the meeting 
} 
else 
{ 
    // The first meeting was selected, or there are no meetings 
} 

TakeWhile в основном останавливается, когда она попадает на первый элемент, который не соответствует предикату - это как Where, который останавливается раньше, другими словами.

Вы должны быть осторожны с заказом, хотя - вы в значительной степени предполагаете, что есть куча невыбранных собраний, за которыми следуют выбранные.

4

Вы можете использовать TakeWhile и LastOrDefault.

Meetings.TakeWhile(m => !m.Selected).LastOrDefault() 
+0

@musefan какая разница между TakeWhile() и Where()? –

+0

@Werlang: 'Where' будет продолжаться для всей последовательности. Представьте последовательность встреч, где выбранная последовательность свойств {false, false, true, true, false} - если вы используете 'Where (...). Last (...)' вы получите элемент 4 вместо Элемент 1. –

+0

@musefan OP заявил: «... как получить метку, происходящую только« до первого », которая выбрана?» –

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