Во-первых
«Лучше» включает в себя сочетание производительности (памяти и скорости)
В общем, вы не можете иметь как эмпирическое правило, если вы оптимизировать скорость, это будет стоить память , если вы оптимизируете память, это будет стоить вам скорости.
Существует лучший вариант, который хорошо работает как на фронтах памяти, так и на скорости, и может использоваться в читаемом режиме (я не восхищен именем функции, однако FindItemReturningPreviousItemFoundItemAndNextItem
- это немного глоток).
Итак, похоже, что пришло время для пользовательского метода расширения, например. , ,
public static IEnumerable<T> FindSandwichedItem<T>(this IEnumerable<T> items, Predicate<T> matchFilling)
{
if (items == null)
throw new ArgumentNullException("items");
if (matchFilling == null)
throw new ArgumentNullException("matchFilling");
return FindSandwichedItemImpl(items, matchFilling);
}
private static IEnumerable<T> FindSandwichedItemImpl<T>(IEnumerable<T> items, Predicate<T> matchFilling)
{
using(var iter = items.GetEnumerator())
{
T previous = default(T);
while(iter.MoveNext())
{
if(matchFilling(iter.Current))
{
yield return previous;
yield return iter.Current;
if (iter.MoveNext())
yield return iter.Current;
else
yield return default(T);
yield break;
}
previous = iter.Current;
}
}
// If we get here nothing has been found so return three default values
yield return default(T); // Previous
yield return default(T); // Current
yield return default(T); // Next
}
Вы можете кэшировать результат этого в список, если вам нужно обратиться к пунктам более чем один раз, но он возвращает найденный элемент, которому предшествует предыдущий пункт, а затем следующий пункт. например
var sandwichedItems = myIEnumerable.FindSandwichedItem(item => item.objectId == "MyObjectId").ToList();
var previousItem = sandwichedItems[0];
var myItem = sandwichedItems[1];
var nextItem = sandwichedItems[2];
По умолчанию для возврата, если это первый или последний элемент, возможно, потребуется изменить в зависимости от ваших требований.
Надеюсь, что это поможет.
Учитывая читаемость, ваш первый вариант является удивительным! Гораздо лучше в ответах. Будет использовать его! Благодаря! –
Я согласен с @Aleksei, используя этот тоже –