Вызов товарища кодирует компьютерных фанатов - Альтернативы Вложенным циклам?

Так мы скачиваем удаленные файлы. Конечно, все зависит от типа файла. Чтобы «загрузить», я надеюсь, что получатель предоставил API для этого

    var resp = https.get({
        url: 'link to some file (img, txt, csv)'
    });

    var f = file.create({
        name: 'myRemoteFile.csv',
        folder: 1234565,
        fileType: file.Type.CSV,
        contents: resp.body
    });

    var id = f.save();
8
задан inspite 15 December 2008 в 17:45
поделиться

8 ответов

Похож на Вас, пробуют к декартову соединению два списка и применяются где пункт. Вот простой пример, показывающий синтаксис Linq для того, чтобы сделать это, которое я думаю, то, что Вы ищете. list1 и list2 могут быть любым IEnumerable, Ваш, где пункт может содержать более подробную логику, и в Вашем избранном пункте можно дергать, в чем Вы нуждаетесь.

        var list1 = Enumerable.Range(1, 100);
        var list2 = Enumerable.Range(1, 100);

        foreach (var item in from a in list1
                             from b in list2
                             where a % b == 0
                             select new { a, b })
        {
            Console.WriteLine(item);
        };

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

8
ответ дан 5 December 2019 в 05:57
поделиться

Нет, конечно, ничего неправильно с вложенными циклами. Они быстры, читаемы и были вокруг, так как разработка программного обеспечения взяла свои первые маленькие шаги.

Поскольку Вы хотите выполнить действия, поскольку Вы выполняете итерации по набору, можно найти, что LINQ был бы интересной авеню для исследования:

http://msdn.microsoft.com/en-us/vcsharp/aa904594.aspx

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

Всего наилучшего и я надеюсь, что Вы весело проводите время на пути - это - большой подход :)

8
ответ дан 5 December 2019 в 05:57
поделиться
foreach (var pair in from obj in listOfObjects
                     from prop in listOfProperties  
                     select new {obj, prop})
{
   Console.WriteLine(pair.obj + ", " + pair.prop);
}
5
ответ дан 5 December 2019 в 05:57
поделиться

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

Если Вы только делаете работу над подмножеством объектов и/или свойств, фильтруете ее (с linq к объектам при выполнении .net 3.5)!

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

3
ответ дан 5 December 2019 в 05:57
поделиться

В то время как мне действительно нравится элегантность решений Linq, я думаю, что моя рекомендация состояла бы в том, чтобы извлечь внутренний цикл в метод; Ваш код закончил бы тем, что смотрел что-то как:

foreach(dataObject in listOfObjects)
    DoSomethingCleverWithProperties(dataObject, listOfProperties);

Это просто чувствует себя более удобным в сопровождении мне.

2
ответ дан 5 December 2019 в 05:57
поделиться
Action<T, TProp> somethingClever = //your clever method

listOfObjects
  .SelectMany(
    o => listOfProperties,
    (o, p) => new {o, p})
  .ToList()
  .ForEach(x => somethingClever(x.o, x.p));
2
ответ дан 5 December 2019 в 05:57
поделиться

В таком сценарии мы часто запускаем путем фильтрации частей, которыми мы интересуемся. Ваш блок dosomethingclever () обычно запускается в

foreach (T dataObject in listOfObjects)
{    
  foreach (TProperty property in listOfProperties)    
  {
    if (property.something == "blah") 
    { // OK, we found the piece we're interested in...

      // do something clever...

    }
  }
}

Это - то, где LINQ является Вашим другом, позволяя Вашему заменить Ваши циклы избранным оператором. Конечно, Вы, возможно, все еще должны выполнить итерации на наборе результатов.

Тонны образцов здесь.

0
ответ дан 5 December 2019 в 05:57
поделиться

Мне нравятся каналы и фильтры Ayende, но это - намного больше кода, чем встроенный LINQ для простых циклов (я предполагаю, что пример кода в вопросе был тривиален).

0
ответ дан 5 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: