Так мы скачиваем удаленные файлы. Конечно, все зависит от типа файла. Чтобы «загрузить», я надеюсь, что получатель предоставил 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();
Похож на Вас, пробуют к декартову соединению два списка и применяются где пункт. Вот простой пример, показывающий синтаксис 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.
Нет, конечно, ничего неправильно с вложенными циклами. Они быстры, читаемы и были вокруг, так как разработка программного обеспечения взяла свои первые маленькие шаги.
Поскольку Вы хотите выполнить действия, поскольку Вы выполняете итерации по набору, можно найти, что LINQ был бы интересной авеню для исследования:
http://msdn.microsoft.com/en-us/vcsharp/aa904594.aspx
Вы будете ограничивать себя более поздними версиями Платформы (3.5 вперед), но можно на самом деле найти подход Функционального программирования довольно изящным. Другие функции языка, которые играют роль при потере работоспособности по этой дороге, включают лямбды и анонимные методы, которые являются захватывающими самостоятельно.
Всего наилучшего и я надеюсь, что Вы весело проводите время на пути - это - большой подход :)
foreach (var pair in from obj in listOfObjects
from prop in listOfProperties
select new {obj, prop})
{
Console.WriteLine(pair.obj + ", " + pair.prop);
}
Если необходимо сделать что-то с каждым объектом и каждым свойством, нет много, чтобы быть сделанным. Вы смогли делать некоторые синтаксически приятные вещи, но нет пути вокруг выполнения работы.
Если Вы только делаете работу над подмножеством объектов и/или свойств, фильтруете ее (с linq к объектам при выполнении .net 3.5)!
Вы могли бы наслаждаться, Фильтруют/Отображают/Уменьшают для Ваших наборов как средство представления лучшего синтаксиса к выполнению операций присвоения.
В то время как мне действительно нравится элегантность решений Linq, я думаю, что моя рекомендация состояла бы в том, чтобы извлечь внутренний цикл в метод; Ваш код закончил бы тем, что смотрел что-то как:
foreach(dataObject in listOfObjects)
DoSomethingCleverWithProperties(dataObject, listOfProperties);
Это просто чувствует себя более удобным в сопровождении мне.
Action<T, TProp> somethingClever = //your clever method
listOfObjects
.SelectMany(
o => listOfProperties,
(o, p) => new {o, p})
.ToList()
.ForEach(x => somethingClever(x.o, x.p));
В таком сценарии мы часто запускаем путем фильтрации частей, которыми мы интересуемся. Ваш блок 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 является Вашим другом, позволяя Вашему заменить Ваши циклы избранным оператором. Конечно, Вы, возможно, все еще должны выполнить итерации на наборе результатов.
Мне нравятся каналы и фильтры Ayende, но это - намного больше кода, чем встроенный LINQ для простых циклов (я предполагаю, что пример кода в вопросе был тривиален).