C# 如何获取列表列表中的第一个索引

C# 如何获取列表列表中的第一个索引,c#,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(); 任何建议/评论。编

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

[["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();

任何建议/评论。

编辑解决方案,因为您已编辑

                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());
这就是你所期望的


希望这能奏效。

您可以使用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]));
输出
您可以压缩所有三个列表

使用zipThree从


我假设所有内部列表都具有相同的长度,并且您希望计算相应索引的平均值(即index0是每个列表第0个值的平均值,index1是第1个值的平均值等)

在这种情况下,要获得每个指数的平均值,请使用以下代码:

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();
int listLength=myList.First().Length;//数组的长度
//数一数
var averages=可枚举。范围(0,listLength)。选择(
index=>myList.Average(innerList=>double.Parse(innerList[index]))
).ToList();

似乎您需要基于列索引而不是行获取
平均值
,然后
.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" }
};
然后,您可以通过以下方式在上述3个列表中创建
.Zip

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
(x + double.Parse(y)) / 3 
= (3.22 + 4.11) / 3 
= 2.44
因此,对于第二个
.Zip
来说,
x
现在是上述第一个
.Zip
的结果,这意味着

x = 3.22
y = "4.11"
然后第二个
Zip
结果将是=>

double.Parse(a) + double.Parse(b) 
= 1.11 + 2.11 
= 3.22
(x + double.Parse(y)) / 3 
= (3.22 + 4.11) / 3 
= 2.44
因此,对于列索引0处的值的
平均值=>
2.44

在上面,

  • 列表[0]:字符串列表中的第一个列表
  • 列表[1]:字符串列表中的第二个列表
  • 列表[2]:字符串列表中的第三个列表
输出:(从控制台)


index2
不应该是4.44吗?13.33是第二个索引值的总和,而不是平均值。这是列表还是2D数组?我更新了我的问题抱歉,我的列表值有字符串值,需要将其解析为doubleuse parse on x=>x[0]@Rockn'Roll更新。我更新了我的问题抱歉,我的列表值有字符串值,需要将其解析为Double我在变量“c”上有错误无法将char转换为stringas预期值,似乎每个列的平均值。不是行。糟糕的是,我的列表上有这个结果:[“1.11,2.11,3.11”],[“2.11,3.11,4.11”],[“4.11,5.11,6.11”]我认为需要将其拆分,然后得到平均值
x = 3.22
y = "4.11"
(x + double.Parse(y)) / 3 
= (3.22 + 4.11) / 3 
= 2.44