将嵌套的 foreach 转换为 lambda 表达式

发布于 2024-10-28 05:00:00 字数 705 浏览 2 评论 0原文

我想将嵌套的 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( //....) )

I want to convert nested 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));
          }
    }

to something like this

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

习惯成性 2024-11-04 05:00:00

您可以安装 ReSharper 5 的试用版,因为它有一个重构选项,可以将(如果可能)foreach 循环转换为 LINQ 表达式。

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

You could install the trial version of ReSharper 5, as this has a refactor option that will convert (if possible) a foreach loop into a LINQ expression.

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

何必那么矫情 2024-11-04 05:00:00

您实际上并没有在这里进行查询,因此 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,所以我停在这里。

You are not really doing a query here, so LINQ might be the wrong approach.
However, you can change your two foreach loops to this:

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)));
}

Does this really provides any benefit? I doubt it.

Going any further with SelectMany and stuff feels like raping LINQ, so I stopped here.

你如我软肋 2024-11-04 05:00:00

首先,我总是创建一个静态实用程序/扩展类来定义这些方法:

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))
    });

First, I always create a static utility/extension class to define these methods:

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);
}

Now all you need is this:

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))
    });
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文