2014-02-03 3 views
0

В моем проекте, я реализовал класс обслуживания, который имеет функцию именования GetList(), которая выглядит следующим образом:Что более эффективно в этом случае? LINQ Query или FOREACH?

IList<SUB_HEAD> GetList(string u) 
{ 
    var collection = (from s in context.DB.SUB_HEAD where (s.head_code.Equals(u))  
     select s); 
    return collection.ToList(); 
} 

, который также может быть реализован как

Arraylist unitlist= new Arraylist(); 
ObjectSet<SUB_HEAD> List = subheadService.GetAll(); 
foreach(SUB_HEAD unit in List) 
{ 
    unitlist.Add(unit.sub_head_code); 
} 

Цель этого является заполнить выпадающее меню.

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

+8

'ArrayList' ???, забыть производительность просто не использовать' ArrayList' – Habib

+4

Они оба являются «O (n)». Разница в производительности обычного пользовательского интерфейса почти наверняка будет несущественной. Используйте запрос Linq и рассмотрите некоторые вещи, которые на самом деле будут иметь значение, например кэширование. –

+1

Вы заметите, что запрос LINQ фильтрует на 'Equals (u)', который цикл foreach не делает ... – PinnyM

ответ

5

Пожалуйста, используйте только версию LINQ. Вы можете выполнить оптимизацию позже, если профиль и определить это слишком медленно (кстати, этого не будет). Кроме того, вы можете использовать LINQ функционального стиля, чтобы сделать одно выражение, которое, я думаю, читается лучше.

IList<SUB_HEAD> GetList(string u) 
{ 
    return context.DB.SUB_HEAD.Where(s => s.head_code == u).ToList(); 
} 

Метод ToList() собирается делать то же самое, что вы делаете вручную. Реализация в рамках .NET выглядит примерно так:

public static class Enumerable 
{ 
    public static List<T> ToList<T>(this IEnumerable<T> source) 
    { 
     var list = new List<T>(); 
     foreach (var item in source) 
     { 
      list.Add(item); 
     } 
     return list; 
    } 
} 

Если вы можете выразить эти 4 строки кода с символами «ToList()», то вы должны сделать так. Дублирование кода плохо, даже если это для чего-то такого простого.

+0

+1, из-за вероятности лучшего преобразования SQL и, что более важно, использования 'ToList'. Тем не менее, обратите внимание, что 'ToList', скорее всего, с помощью AddRange, который, безусловно, лучше, чем итеративно копирование коллекции, потому что она включает в себя только один изменение размера массива подложки. – Magus

+0

@Magus 'ToList' не может делать ни одного изменения массива поддержки *, если * он не перечисляет' IEnumerable '* дважды * - что это не так. –

+0

Хм, справедливо. – Magus

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