C# C从列表中的和中检索最接近0的绝对值

C# C从列表中的和中检索最接近0的绝对值,c#,linq,C#,Linq,我想做的是得到Math.AbsA+B+C对于每个ID最接近于0的时间。它相当大。我有一个从CSV文件中得到的列表,类似这样: 我有下面的代码,虽然它还没有完成,但从技术上讲,它打印了我想要的值。然而,当我调试它时,它似乎并没有在ID中循环,而是在一个循环中完成。我的想法是,我可以获得所有不同的ID,然后对每个ID进行不同的时间检查,将它们全部放在临时列表中,然后使用聚合得到最接近0的值。但我觉得应该有比这更有效的方法。是否有一个更快的LINQ函数可以用来实现我想要的 for (int i =

我想做的是得到Math.AbsA+B+C对于每个ID最接近于0的时间。它相当大。我有一个从CSV文件中得到的列表,类似这样:

我有下面的代码,虽然它还没有完成,但从技术上讲,它打印了我想要的值。然而,当我调试它时,它似乎并没有在ID中循环,而是在一个循环中完成。我的想法是,我可以获得所有不同的ID,然后对每个ID进行不同的时间检查,将它们全部放在临时列表中,然后使用聚合得到最接近0的值。但我觉得应该有比这更有效的方法。是否有一个更快的LINQ函数可以用来实现我想要的

for (int i = 0; i < ExcelRecords.Select(x => x.Id).Distinct().Count(); i++)
        {
            for (int j = 0; j < ExcelRecords.Select(y => y.Time).Distinct().Count(); j++)
            {
                List<double> test = new List<double>();

                var a = ExcelRecords[j].a;
                var b = ExcelRecords[j].b;
                var c = ExcelRecords[j].c;
                test.Add(Math.Abs(pitch + yaw + roll));

                Console.WriteLine(Math.Abs(pitch + yaw + roll));
            }
        }

使用像这样的显式for循环将LINQ的强大功能和灵活性抛到了窗外。LINQ的能力来自枚举器,它可以单独使用,也可以与foreach循环结合使用

使用Distinct首先获取一个列表,然后使用该列表有选择地将行分组到批中,这样做的工作量远远超过了必要的工作量。这就是GroupBy的设计宗旨

var times=ExcelRecords.GroupByrow=>row.Id .Selectg=>g.Aggregatemin,row=>Math.Absrow.a+row.b+row.c使用像这样的显式for循环将LINQ的强大功能和灵活性抛到了窗外。LINQ的能力来自枚举器,它可以单独使用,也可以与foreach循环结合使用

使用Distinct首先获取一个列表,然后使用该列表有选择地将行分组到批中,这样做的工作量远远超过了必要的工作量。这就是GroupBy的设计宗旨

var times=ExcelRecords.GroupByrow=>row.Id .Selectg=>g.Aggregatemin,row=>Math.Absrow.a+row.b+row.c我认为最具可读性的方法是按Id分组,对每个组进行排序,并从每个组中选择第一次:

var times = ExcelRecords.GroupBy(x => x.Id)
    .Select(grp => grp.OrderBy(item => Math.Abs(item.A + item.B + item.C)))
    .Select(grp => grp.First().Time);

我认为最具可读性的方法是按Id分组,对每个组进行排序,并从每个组中选择第一次:

var times = ExcelRecords.GroupBy(x => x.Id)
    .Select(grp => grp.OrderBy(item => Math.Abs(item.A + item.B + item.C)))
    .Select(grp => grp.First().Time);

作为旁注。假设您的ExcelRecords.Selectx=>x.Id.Distinct.Count在整个循环中都没有变化,在这种情况下,您应该在循环之前计算并将其放入变量中。这是因为它将对表达式every循环求值,从而对每一行的整个集合执行Select、Distinct和Count。假设您的ExcelRecords.Selectx=>x.Id.Distinct.Count在整个循环中都没有变化,在这种情况下,您应该在循环之前计算并将其放入变量中。这是因为它将对表达式every循环求值,从而对每一行的整个集合执行Select、Distinct和Count。谢谢!这完全有道理,我也觉得有太多的循环进行。我可以问一下.Time在Select语句中的作用吗?@necy它获取g.Min返回的行的Time属性,因此您最终得到一个显示在Time列中的值列表。@Abion47我似乎遇到了一个问题。Select语句没有将.Time识别为属性statemet@Neicy以不同的方式编辑使用聚合的方法。谢谢你们的帮助!这也足以推动我们正确地学习LINQ,哈哈哈,谢谢!这完全有道理,我也觉得有太多的循环进行。我可以问一下.Time在Select语句中的作用吗?@necy它获取g.Min返回的行的Time属性,因此您最终得到一个显示在Time列中的值列表。@Abion47我似乎遇到了一个问题。Select语句没有将.Time识别为属性statemet@Neicy以不同的方式编辑使用聚合的方法。谢谢你们的帮助!这也足以推动我们正确地研究林克哈哈