Какой самый эффективный способ сделать эти два цикла foreach? - PullRequest
2 голосов
/ 12 марта 2009

Я не уверен, что это лучший способ сделать следующий код. Я не продан на foreach внутри другого foreach. Можно ли это сделать * лучше ** с Linq?

* Я понимаю, что лучше может быть либо
а) более производительный
б) легче читать / более элегантно
в) все вышеперечисленное

ПРИМЕЧАНИЕ. Решения .NET 3.5 принимаются :) ПРИМЕЧАНИЕ 2: два IList были результатом хранимой процедуры с несколькими наборами записей через Linq2Sql.

вот вымышленный код:

// These two lists are the results from a IMultipleResults Linq2Sql stored procedure.
IList<Car> carList = results.GetResult<Car>().ToList();
IList<Person> people = results.GetResult<Person>().ToList();

// Associate which people own which cars.
foreach(var person in people)
{
    var cars = (from c in cars
                where c.CarId == person.CarId
                select c).ToList();

    foreach (var car in cars)
    {
        car.Person = person;    
    }
}

Приветствия:)

1 Ответ

6 голосов
/ 12 марта 2009

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

var q = from person in people
        join car in cars on person.CarId equals car.CarId
        select new { car, person };
foreach(var o in q)
{
  o.car.Person = o.person; 
}

Редактировать: После намека Джона на то, что эта версия быстрее, я получил любопытство и профилировал обе функции. Эта версия кажется в два раза быстрее, что удивительно. Я проверил разборку. Издержки исходной реализации, похоже, связаны с созданием новых перечислителей как для внешнего, так и для внутреннего цикла, что приводит к накладным расходам P / new / dispose.

Для этого кода создан только один перечислитель, который, я думаю, является магией функции "Присоединиться". Хотя я не проверял, как это работает.

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