需要将LINQ(GROUP BY和sum)转换为foreach逻辑。 C#

时间:2017-05-09 07:01:12

标签: c# linq foreach

我必须根据3个Key值对某些记录进行分组,然后总结一组中的其他值。但后来才意识到LINQ的性能比每个都要小。所以请帮助将每个

的linq代码转换为正常
    List<Test> testList= new List<Test>();
    testList.GroupBy(ab => new
    {
     ab.Property1,
     ab.Property2,
     ab.Property3                         
    }).Select(a => new Test
            {
             Property1= a.Key.Property1,
             Property2= a.Key.Property2,
             Property3= a.Key.Property3,               
             Property4= a.Select(ab => ab.Property4).FirstOrDefault(),
             Property5= a.Sum(ab => ab.Property5),
             Property6= a.Sum(ab => ab.Property6),
             Property7= a.Sum(ab => ab.Property7),
             Property8= a.Sum(ab => ab.Property8),
            });

2 个答案:

答案 0 :(得分:1)

请尝试以下链接进行转换。     http://www.sqltolinq.com/

<强>更新

您也可以按照以下链接使用Resharper。 How to get Resharper to convert back to a foreach loop

答案 1 :(得分:0)

逐行应该是:

List<Test> testList = new List<Test>();

// string, string, string = Property1, Property2, Property3
var dict = new Dictionary<Tuple<string, string, string>, List<Test>>();

foreach (var el in testList)
{
    List<Test> list;

    var key = Tuple.Create(el.Property1, el.Property2, el.Property3);

    if (!dict.TryGetValue(key, out list))
    {
        list = new List<Test>();
        dict.Add(key, list);
    }

    list.Add(el);
}

var output = new List<Test>(dict.Count);

foreach (var kv in dict)
{
    var list = kv.Value;

    var el = new Test
    {
        Property1 = kv.Key.Item1,
        Property2 = kv.Key.Item2,
        Property3 = kv.Key.Item3,
        Property4 = list[0].Property4,
    };

    output.Add(el);

    for (int i = 0; i < list.Count; i++)
    {
        el.Property5 += list[i].Property5;
        el.Property6 += list[i].Property6;
        el.Property7 += list[i].Property7;
        el.Property8 += list[i].Property8;
    }
}

此处唯一的“真正”优势是for部分的内部Sum周期是单个for,而不是由for使用的四个Sum四个独立的List<Test> testList = new List<Test>(); // string, string, string = Property1, Property2, Property3 var dict = new Dictionary<Tuple<string, string, string>, Test>(); foreach (var el in testList) { Test el2; var key = Tuple.Create(el.Property1, el.Property2, el.Property3); if (!dict.TryGetValue(key, out el2)) { el2 = new Test { Property1 = el.Property1, Property2 = el.Property2, Property3 = el.Property3, Property4 = el.Property4, }; dict.Add(key, el2); } el2.Property5 += el.Property5; el2.Property6 += el.Property6; el2.Property7 += el.Property7; el2.Property8 += el.Property8; } var output = dict.Values.ToList();

但还有另一种方法可以做到,这与LINQ ...

不同
foreach

这里我们统一了两个for周期,我们删除了内部GroupBy周期。

现在,除非您正在处理数百万条记录,否则我认为两种解决方案的差异并不大。

请注意,我的代码和LINQ代码之间的输出存在重要差异:IEnumerable运算符在Dictionary<,>上使用时,保证组的顺序与输入(因此第一个元素将生成第一个组,具有不同键的下一个元素将生成第二个组,依此类推)。使用 ; getting user input mov rax, 0 mov rdi, 0 mov rsi, number mov rdx, 100 syscall 这不会发生。输出的顺序没有定义,将是“随机的”。