【问题标题】:How to find the number of each elements in the row and store the mean of each row in another array using C#?如何使用 C# 查找行中每个元素的数量并将每行的平均值存储在另一个数组中?
【发布时间】:2012-07-18 12:11:47
【问题描述】:

我正在使用下面的代码逐行从文本文件中读取数据。我想将每一行分配到一个数组中。我必须能够找到数量或行/数组以及每个元素的数量。

我还想对部分或全部行进行一些操作并返回它们的值。

我得到了行数,但有没有办法循环类似:

    *for ( i=1 to number of rows)
    do
    mean[i]<-row[i]
    done
    return mean*


var data = System.IO.File.ReadAllText("Data.txt");

var arrays = new List<float[]>();

var lines = data.Split(new[] {'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries);

foreach (var line in lines)
{
    var lineArray = new List<float>();

    foreach (var s in line.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries))
    {
        lineArray.Add(Convert.ToSingle(s));
    }
    arrays.Add(lineArray.ToArray());

}

var numberOfRows = lines.Count();
var numberOfValues = arrays.Sum(s => s.Length);

【问题讨论】:

    标签: c# arrays rows textinput datainputstream


    【解决方案1】:
    var arrays = new List<float[]>();
    //....your filling the arrays
    var averages = arrays.Select(floats => floats.Average()).ToArray(); //float[]
    var counts = arrays.Select(floats => floats.Count()).ToArray(); //int[]
    

    【讨论】:

      【解决方案2】:

      不确定我是否理解了这个问题。你的意思是像

      foreach (string line in File.ReadAllLines("fileName.txt")
      {
      ...
      }
      

      【讨论】:

      • 您也可以将我的回答与 Tomas 结合起来。
      【解决方案3】:

      你可以使用Linq吗?您可能需要在顶部添加using System.Linq;

      float floatTester = 0;
      List<float[]> result = File.ReadLines(@"Data.txt")
              .Where(l => !string.IsNullOrWhiteSpace(l))
              .Select(l => new {Line = l, Fields = l.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) })
              .Select(x => x.Fields
                            .Where(f => Single.TryParse(f, out floatTester))
                            .Select(f => floatTester).ToArray())
              .ToList();
      
      // now get your totals
      int numberOfLinesWithData = result.Count;
      int numberOfAllFloats = result.Sum(fa => fa.Length);
      

      解释:

      1. File.ReadLines 读取文件的行(不是一次全部读取,而是逐行读取)
      2. Where 仅返回给定谓词为真的元素(例如,该行必须包含多于空文本)
      3. new { 创建具有给定属性的匿名类型(例如,用逗号分隔的字段)
      4. 然后我尝试将每个字段解析为浮动
      5. 所有可以解析的都将添加到float[]ToArray()
      6. 将一起添加到List&lt;float[]&gt;ToList()

      【讨论】:

        【解决方案4】:

        找到了一种有效的方法来做到这一点。谢谢大家的意见!

        private void ReadFile()
            {
                var lines = File.ReadLines("Data.csv");
                var numbers = new List<List<double>>();
                var separators = new[] { ',', ' ' };
                /*System.Threading.Tasks.*/
                Parallel.ForEach(lines, line =>
                {
                    var list = new List<double>();
                    foreach (var s in line.Split(separators, StringSplitOptions.RemoveEmptyEntries))
                    {
                        double i;
        
                        if (double.TryParse(s, out i))
                        {
                            list.Add(i);
                        }
                    }
        
                    lock (numbers)
                    {
                        numbers.Add(list);
                    }
                });
        
                var rowTotal = new double[numbers.Count];
                var rowMean = new double[numbers.Count];
                var totalInRow = new int[numbers.Count()];
        
                for (var row = 0; row < numbers.Count; row++)
                {
                    var values = numbers[row].ToArray();
        
                    rowTotal[row] = values.Sum();
                    rowMean[row] = rowTotal[row] / values.Length;
                    totalInRow[row] += values.Length;
                }
        

        【讨论】:

          猜你喜欢
          • 2012-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-20
          • 1970-01-01
          • 2021-09-12
          • 1970-01-01
          相关资源
          最近更新 更多