如何获得列表列表中的第一个索引

时间:2019-04-01 06:29:17

标签: c#

如何从列表中获取第一个索引并获取其平均值。目前,我的清单上有返回值:

[["1.11, 2.11, 3.11"], ["2.11, 3.11, 4.11"], ["4.11, 5.11, 6.11"]]

这是我的预期结果:

var index0 = 2.44
var index1 = 3.44
var index2 = 4.44

仅在单个列表上,我使用它来获取平均值:

var avg = myList.Select(double.Parse).Average();

任何建议/评论TIA。

5 个答案:

答案 0 :(得分:1)

编辑解决方案,因为您已进行编辑。

                String[][] TValue = new String[][]
                {
                    new String[] {"1.11", "2.11", "3.11" },
                    new String[] {"2.11", "3.11", "4.11" }, 
                    new String[] {"4.11", "5.11", "6.11" }
                };

                Console.WriteLine("Avg[0] => {0:F2}", TValue.Select(x => double.Parse(x[0])).Average());
                Console.WriteLine("Avg[1] => {0:F2}", TValue.Select(x => double.Parse(x[1])).Average());
                Console.WriteLine("Avg[2] => {0:F2}", TValue.Select(x => double.Parse(x[2])).Average());

这就是您所期望的。

希望这项工作。

答案 1 :(得分:0)

您可以使用Linq。

根据评论进行了更新

var list = new [] {  "1.11, 2.11, 3.11" , "2.11,3.11, 4.11" ,  "4.11,5.11,6.11" };
var collection = list.Select(x => x.Split(',').Select(c => double.Parse(c)).ToList()).ToList();
var result = collection.First()
               .Select((dummy, i) =>
                  collection.Average(inner => inner[i]));

输出

2.44
3.44
4.44

答案 2 :(得分:0)

您可以压缩所有三个列表

使用How to combine more than two generic lists in C# Zip?中的zipThree

using System;
using System.Collections.Generic;
using System.Linq;

public static class MyFunkyExtensions
{
    public static IEnumerable<TResult> ZipThree<T1, T2, T3, TResult>(
        this IEnumerable<T1> source,
        IEnumerable<T2> second,
        IEnumerable<T3> third,
        Func<T1, T2, T3, TResult> func)
    {
        using (var e1 = source.GetEnumerator())
        using (var e2 = second.GetEnumerator())
        using (var e3 = third.GetEnumerator())
        {
            while (e1.MoveNext() && e2.MoveNext() && e3.MoveNext())
                yield return func(e1.Current, e2.Current, e3.Current);
        }
    }
}

class MainClass {
  public static void Main (string[] args) {
    var list = new List<List<double>> { new List<double> {1.11,2.11,3.11},  new List<double>  {2.11,3.11,4.11},  new List<double>  {4.11,5.11,6.11} };

    var a = list[0].ZipThree(list[1], list[2], (x, y, z) => (x + y + z) / 3);
    Console.WriteLine(
      string.Join(",",
      a.Select(s => s.ToString())));
  }
}

它返回

2.44333, 3.443333, 4.44333

答案 3 :(得分:0)

我假设所有内部列表的长度相同,并且您想计算相应索引的平均值(即index0是每个列表中第0个值的平均值,index1是第一个值的平均值,依此类推)。

在这种情况下,要获取每个索引的平均值,请使用以下代码:

int listLength = myList.First().Length; // Length for an array
                                        // Count for a List<T>

var averages = Enumerable.Range(0, listLength).Select(
    index => myList.Average(innerList => double.Parse(innerList[index]))
    ).ToList();

答案 4 :(得分:0)

似乎您需要根据列索引而不是行来获取avg,然后.Zip将是您的一种选择,

假设您的字符串列表为

var myList = new List<List<string>>
{
       new List<string> { "1.11, 2.11, 3.11" },  //<= Notice here single item in list with comma(,) separated
       new List<string> { "2.11, 3.11, 4.11" },
       new List<string> { "4.11, 5.11, 6.11" }
};

因此,您需要先用逗号(,)在内部列表中分割字符串,以将每个项目作为单独的字符串,

var list = myList
    .SelectMany(x => x
           .Select(y => y.Split(',')
           .Select(z => z.Trim())
           .ToList()))
    .ToList();

然后您可以通过以下方式将.Zip列在以上3个列表中:

var results = list[0]
    .Zip(list[1], (a, b) => double.Parse(a) + double.Parse(b))
    .Zip(list[2], (x, y) => (x + double.Parse(y)) / 3)
    .ToList();

//------------------Print the result---------------

foreach (var item in results)
{
    Console.WriteLine(Math.Round(item, 2));
}

.Zip的工作原理?

让所有列的值作为索引0。

a = "1.11"
b = "2.11"

那么第一个Zip的结果将是=>

double.Parse(a) + double.Parse(b) 
= 1.11 + 2.11 
= 3.22

因此对于第二个.Zipx现在是上述第一个.Zip的结果,表示

x = 3.22
y = "4.11"

那么第二个Zip的结果将是=>

(x + double.Parse(y)) / 3 
= (3.22 + 4.11) / 3 
= 2.44

因此,对于Average列索引0处的值=> 2.44

在上面,

  • list [0] :字符串列表中的第一个列表。
  • list [1] :字符串列表中的第二个列表。
  • list [2] :字符串列表中的第三个列表。

输出:(从控制台)

enter image description here