如何将List.ForEach()的结果打包到新列表?

时间:2014-01-28 17:12:33

标签: c# linq list

我正在学习C#。

我有两个相同类型的列表。

struct Foo
{
    string fKey;
    Bar bVal;
}
List<Foo> f1; List<Foo> f2;

现在f1和f2包含相同数量的元素,f1中的每个fKey也存在于f2中,但位于不同的位置。

我想要做的是在fKey上加入这两个列表,对Bar值进行一些操作(某种合并),并将结果存储到新的List中。

Foo Merge(Foo f1, Foo f2)
{
// Merge
    return new Foo(f1);
}

为此,我已经到了这里。

f1.Join(f2, oldFoo => oldFoo.fKey, newFoo => newFoo.fKey, (oldFoo, newFoo) => new { myOldFoo = oldFoo, myNewFoo = newFoo } //  Join on the fKey attribute
                        ).ToList().         //  Dump the results to a list
                            ForEach(aPair => Merge(aPair.myNewFoo, aPair.myOldFoo));

在命令式编程中,我会将Merge()的返回值推送到新的List。 我怎么能在这个结构中做到这一点?

2 个答案:

答案 0 :(得分:4)

Merge投影中执行Select操作,然后使用ToList将结果具体化为列表。

var l = f1.Join(f2, oldFoo => oldFoo.fKey, newFoo => newFoo.fKey, 
                    (oldFoo, newFoo) => new { myOldFoo = oldFoo, myNewFoo = newFoo })
          .Select(aPair => Merge(aPair.myNewFoo, aPair.myOldFoo))
          .ToList();

修改:我认为您可以将Merge合并到Join中以简明扼要:

var l = f1.Join(f2, oldFoo => oldFoo.fKey, newFoo => newFoo.fKey, 
                    (oldFoo, newFoo) => Merge(newFoo, oldFoo))
          .ToList();

答案 1 :(得分:1)

这正是ConvertAll()函数的作用。