Преобразовать в вложенный foreach в лямбда-выражение - PullRequest
1 голос
/ 30 марта 2011

Я хочу преобразовать вложенный foreach

foreach (Tuple<int, string, Guid> s in services)
     {
      foreach (BEPartnership p in partnership)
         {                                                                      
           p.Partner.Services = new List<Tuple<int, string>>(); 
             if (s.Item3 == p.Partner.Id)
               p.Partner.Services.Add(new Tuple<int, string>(s.Item1, s.Item2));
          }
    }

во что-то подобное

services.SelectMany( 
 s=>partnership.Select(
 p=>new {partnerId = p.Partner.Id, servicePartnerId = s.Item3})
  .Where(x=>x.partnerId == x.servicePartnerId)
  .ToList()
  .ForEach( //....) )

Ответы [ 3 ]

1 голос
/ 30 марта 2011

Вы на самом деле не делаете запрос здесь, поэтому LINQ может быть неправильным подходом.
Однако вы можете изменить два цикла foreach на следующее:

foreach (var p in partnership)
    p.Partner.Services = new List<Tuple<int, string>>();

foreach (var s in services)
{
    partnership.Where(p => s.Item3 == p.Partner.Id).ToList().ForEach(
        p => p.Partner.Services.Add(new Tuple<int, string>(s.Item1, s.Item2)));
}

Это действительно дает какую-то выгоду?Я сомневаюсь в этом.

Пойдем дальше с SelectMany, и все это похоже на изнасилование LINQ, поэтому я остановился здесь.

1 голос
/ 30 марта 2011

Вы можете установить пробную версию ReSharper 5, так как она имеет опцию рефакторинга, которая преобразует (если возможно) цикл foreach в выражение LINQ.

http://blogs.jetbrains.com/dotnet/2009/12/resharper-50-preview-loops-2-linq/

0 голосов
/ 30 марта 2011

Во-первых, я всегда создаю статическую утилиту / класс расширения для определения этих методов:

public static void AddAll<T>(this ICollection<T> c, IEnumerable<T> items)
{
    items.ForEach(item => c.Add(item));
}

public static void AddAll<T1, T2>(this ICollection<T1> c, IEnumerable<T2> items, Func<T2, T1> converter)
{
    c.AddAll(items.Select(converter));
}

public static void ForEach<T>(this IEnumerable<T> e, Action<T> action)
{
    foreach (T item in e)
        action.Invoke(item);
}

Теперь все, что вам нужно, это:

partnership.ForEach(p => 
    { 
        p.Partner.Services = new List<Tuple<int, string>>(); 
        p.Partner.Services.AddAll(from s in services
                 where s.Item3 == p.Partner.Id
                 select Tuple.Create(s.Item1, s.Item2))
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...