2016-04-12 2 views
-3

У меня есть список объектов (т. Е. List), и я хочу, чтобы свободно отображал функцию, которая предоставит мне элементы этого списка перед определенным членом (или первым его возникновением).List.Before method

Вот что я использую. Есть ли более чистый или более сжатый способ?

public static List<T> Before<T>(this List<T> Source, T Value) 
{ 
    List<T> functionReturnValue = default(List<T>); 
    functionReturnValue = new List<T>(); 
    foreach (T Thing in Source) { 
     if (Thing.Equals(Value)) { 
      break; 
     } 
     functionReturnValue.Add(Thing); 
    } 
    return functionReturnValue; 
} 
+5

Я не спустил вниз, но я искушаюсь. Если вы не хотите проголосовать, не говорите о том, чтобы опуститься вниз. –

+2

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

+0

Как бы вы определили, какое решение более «элегантно», чем другое? – mustaccio

ответ

5

Ну, «самый элегантный» является полностью субъективным и недостижимо, но вы можете использовать TakeWhile:

public static List<T> Before<T>(this List<T> Source, T Value) 
{ 
    return source.TakeWhile(i => !i.Equals(Value)).ToList(); 
} 

Обратите внимание, что вы могли сделать его более общим с помощью IEnumerable вместо List:

public static IEnumerable<T> Before<T>(this IEnumerable<T> Source, T Value) 
{ 
    return source.TakeWhile(i => !i.Equals(Value)); 
} 

Фактически, doucmentation for TakeWhile дает пример того, что bas делает то, что вы хотите, просто со строковыми сравнениями.

+0

Ваш второй ответ, вероятно, по всей вероятности, неприметно изящный. Это не может быть проще, но все же выполнить работу. Это не недостижимо; вы только что достигли этого. Если мы определяем элегантность, чтобы обозначать наименьшее количество умственных конструкций, необходимых для визуального анализа (наиболее легко понимаемого). – toddmo