如何在C#中获得三个列表的总和(平均值)?

时间:2014-03-05 16:04:49

标签: c# image list average

我有三个列表,每个列表只代表0和1,它们与三个图像的像素值有关。 我的问题是如何获得这三个列表的总和(平均值)并将其表示在新列表中? 这是我的image1的例子:

List<int> image1 = new List<int>();
        int blackColor = 0;

        for (int x = 0; x < bmp1.Width; x++)
        {
            for (int y = 0; y < bmp1.Height; y++)
            {
                Color color = bmp1.GetPixel(x, y);

                if (color.ToArgb() == Color.Black.ToArgb())
                {
                    image1.Add(0);
                    blackColor++;                        
                }
                else
                {
                    image1.Add(1);
                }
            }
        }

2 个答案:

答案 0 :(得分:10)

让我确保我理解这个问题。您有三个相同长度的列表:

list A:  1, 2, 4, 3
list B:  3, 2, 4, 1
List C:  2, 7, 1, 8

并且您希望获得第三个列表,即每个列表的平均值:

List D:  2, 4, 3, 4

这是zip连接的工作。

var sumOfFirstTwo = list1.Zip(list2, (x, y)=>x + y);

sumOfFirstTwo现在是序列,它是前两个列表的总和。

var sumOfAllThree = sumOfFirstTwo.Zip(list3, (x, y)=>x + y);

sumOfAllThree现在是所有三个列表之和的序列。

var average = sumOfAllThree.Select(x=>x/3).ToList();

有意义吗?

答案 1 :(得分:0)

这适用于任意数量的列表

var firstList = new[] { 1, 2, 3, 1 };
var secondList = new[] { 2, 3, 1, 1 };
var thirdList = new[] { 3, 1, 2, 2 };
var lists = new[] { firstList, secondList, thirdList };

var listLengths = lists.Select(x => x.Count());
if (listLengths.Distinct().Count() != 1)
    throw new Exception("Line lengths must be the same");
var lengthOfEachList = listLengths.First();
var averages = new List<double>();
for (var i = 0; i != lengthOfEachList; ++i) {
    averages.Add(lists.Average(x => x[i]));
}

LINQ方式将是

var averages = Enumerable.Range(0, lengthOfEachList).Select(x => lists.Average(y => y[x]));