如何在Linq语句中转换并分配正确的值

时间:2010-02-10 20:13:23

标签: c# linq lambda

我一直试图以基于表达式的方式编写以下代码,但不确定如何在比较后对该对象进行分配。任何帮助都将受到高度赞赏。

var pcs = from a in collection
      group a by a.TotType
      into g
      select new
      {
          TType = g.Key,
          SColl = g.Select(r => r)
     };

for (int i = 0; i < processResult.PAndLReport.BreakdownTotTypeCollection.Count; i++)
{
  foreach (var ttypes in pcs)
  {
    if (processResult.PAndLReport.BreakdownTotTypeCollection[i].TotType == ttypes.TType)
    {
      BreakdownCollection coll = new BreakdownCollection();
      foreach (var item1 in ttypes.SColl)
       {
         coll.Add(item1);
       }

      processResult.PAndLReport.BreakdownTotTypeCollection[i].BreakdownCollection = coll;
     }
  }
}

2 个答案:

答案 0 :(得分:1)

所以 - 代码有效,但它非常详细。

这是减少代码的一个方面。我做了一些假设(这段代码与其他代码没有完全相同的分配),但它可能接近你想要的。

var pcs = collection.ToLookup(a => a.TotType);

foreach(var bttcoll in processResult
    .PAndLReport
    .BreakdownTotTypeCollection)
{
  var items = pcs[bttcoll.ToTType];
    //do you have a constructor that takes an IEnumerable<Item> ?
  bttcoll.BreakdownCollection = new BreakdownCollection(items)
}

通常,您应该避免在linq查询中更改对象状态。 Linq来自函数式编程思维模式,其中状态永远不会改变(相反,新对象是使用所需状态创建的)。

答案 1 :(得分:0)

如果答案大卫B给出了作品,那很好,但不要在你的代码中使用它。第一个(大概)可以工作,下一个人更容易理解。

要考虑的一些事情:

  1. 如果您的代码将被使用很长一段时间,那么将花费更多的时间来维护它然后在原始的写作中。在您忘记了自己正在做什么之后不久,您将不得不修改行为。让自己更轻松。
  2. 如果您的代码不会被使用很长时间,那么您花了更多时间来调整样式和流程,然后就会恢复。
  3. 使用表达式样式Linq而不是声明式样式没有速度优势。编译器将为您转换代码,在大多数情况下,它将与您自己编写的代码一样高效。