Плюсы и минусы между LINQ и традиционными подходами на основе коллекций - PullRequest
4 голосов
/ 07 сентября 2008

Будучи относительно новым для игры .net, мне было интересно, имел ли кто-нибудь опыт плюсов / минусов между использованием LINQ и что можно считать более традиционными методами работы со списками / коллекциями?

Для конкретного примера проекта, над которым я работаю: список уникальных пар имя / имя извлекается из удаленного веб-сервиса.

  • этот список будет меняться нечасто (один раз в день),
  • будет доступно только для чтения с точки зрения приложения, в котором оно используется
  • будет храниться на уровне приложения для всех запросов на доступ

Учитывая эти моменты, я планирую хранить возвращаемые значения на уровне приложения в одноэлементном классе.

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

sugarsoap soapService = new sugarsoap();
branch_summary[] branchList = soapService.getBranches();

foreach (branch_summary aBranch in branchList)
{
    branchNameList.Add(aBranch.id, aBranch.name);
}

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

public string branchName (string branchId) 
{
    //branchList populated in the constructor
    branch_summary bs = from b in branchList where b.id == branchId select b;
    return branch_summary.name;
}

Является ли один из них лучше другого - есть ли третий путь? Я открыт для всех ответов, как для подходов, так и для решений, предлагающих элегантность, и решений, которые повышают производительность.

Ответы [ 4 ]

3 голосов
/ 07 сентября 2008

я не думаю, что написанное вами linq будет компилироваться, должно быть

public string branchName (string branchId) 
{
    //branchList populated in the constructor
    branch_summary bs = (from b in branchList where b.id == branchId select b).FirstOrDefault();
    return branch_summary == null ? null : branch_summary.name;
}

обратите внимание на .FirstsOrDefault ()

Я бы предпочел использовать LINQ, потому что его можно использовать в других местах, для написания более сложных фильтров для ваших данных. Я также думаю, что это легче читать, чем альтернатива NameValueCollection.

это мои $ 0,02

1 голос
/ 15 июля 2009

В целом, ваш простой однострочный цикл / foreach будет быстрее, чем при использовании Linq. Кроме того, Linq не всегда предлагает существенные улучшения читаемости в этом случае. Вот общее правило, которым я кодирую:

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

0 голосов
/ 29 сентября 2012

Сокращенный и обработанный:

public string BranchName(string branchId) 
{
    var bs = branchList.FirstOrDefault(b => b.Id == branchId);

    return bs == null ? null : bs.Name;
}
0 голосов
/ 07 сентября 2008

Я не уверен, что одноэлементный класс абсолютно необходим, вам всегда нужен глобальный доступ? Список большой?

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

Оба решения жизнеспособны. Я думаю, что LINQ будет заполнять коллекцию быстрее в конструкторе (но не заметно быстрее). Традиционные подходы, основанные на коллекциях, хороши. Лично я бы выбрал версию LINQ хотя бы потому, что это новая технология, и мне нравится ее использовать. Предполагая, что ваша среда развертывания имеет .NET 3.5 ...

Есть ли у вас на веб-сервисе метод получения веток по идентификатору? Это будет третий вариант, если информация о ветвях нужна нечасто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...