【问题标题】:Maximum value in datatable column c#数据表列c#中的最大值
【发布时间】:2013-04-13 08:30:09
【问题描述】:

我有一组正在读入数据表的文本文件。我希望能够阅读第一列(Id)并找出最高的数字。每个文件依次从 0 到至少 21。我尝试了以下链接的建议:How to select min and max values of a column in a datatable?

很遗憾,我无法工作。一种有效的建议显示在倒数第二行,但它返回的值是 8 或 9。关于如何正确获得我正在寻找的结果的任何建议?

        string filePath = System.IO.Path.GetFullPath(curriculum);
        DataTable curriculmDataTable = new DataTable();

        curriculmDataTable.Columns.Add("Id");
        curriculmDataTable.Columns.Add("Course");
        curriculmDataTable.Columns.Add("Credit");

        // Read in a file line-by-line, and store it
        var txtFileLine = File.ReadAllLines(filePath).ToList();

        //Reads line splits data to colums at tab (ASCII value 9)
        txtFileLine.ForEach(line => curriculmDataTable.Rows.Add(line.Split((char)9)));


        //Suggestions from link
        int max = Convert.ToInt32(curriculmDataTable.Select("Id=max(Id)")[0][0]);   
        label1.Text = ""+ max;

【问题讨论】:

    标签: c#-4.0 datatable


    【解决方案1】:

    我们可以使用这种语法从数据表中的列中获取最大值

    var maxValue = dataTblDetails.Compute("max(ColumnName)", string.Empty);

    【讨论】:

      【解决方案2】:

      问题是您已经创建了字符串列,但您想根据它们的数值获取最大值。最好的方法是首先存储正确的类型。然后你可以使用DataTable.ComputeLinq-To-DataSet:

      创建一个int 列:

       curriculmDataTable.Columns.Add("Id", typeof(int));
      

      strings 转换为int 并将它们添加到表中:

      foreach(string line in File.ReadLines(filePath))
      {
          DataRow row = curriculmDataTable.Rows.Add();
          string[] fields = line.Split(new[]{(char)9});
          int id;
          if(fields.Length == 3 && int.TryParse(fields[0], out id)
          {
              row.SetField("Id", id);
              row.SetField("Course", fields[1]);
              row.SetField("Credit", fields[2]);
          }
      }
      

      现在你可以使用 Linq:

      int maxID = curriculmDataTable.AsEnumerable().Max(r => r.Field<int>("Id"));
      

      DataTable.Compute(也适用于早期的 .NET 版本):

      int maxID = (int)curriculmDataTable.Compute("Max(Id)", "")
      

      【讨论】:

      • 我尝试了您的建议,但它向我抛出了一个错误。在 foreach 中,我得到一个 System.NullReferenceException is unhandled Message=Object reference not set to an instance of an object.
      • 从哪里得到异常,null是什么对象?
      • 我有一种感觉是由于我缺乏知识,但是 txtFileLine 被突出显示。
      • 然后用File.ReadAllLines(filePath)或更好的方式初始化它,因为它不需要在内存中创建一个新的集合File.ReadLines(filePath)。请注意,我刚刚编辑了我的答案,请参阅revision history
      • 我最终不需要你的最后回复。问题是我放置 foreach 部分的位置(在行之前 var txtFileLine = File.ReadAllLines(filePath).ToList(); //Reads line splits data to column at tab (ASCII value 9) txtFileLine.ForEach(line => curriculmDataTable .Rows.Add(line.Split((char)9)));) 当我重新排序时,事情就像你说的那样工作。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2011-01-27
      • 2019-01-02
      • 2011-12-11
      • 1970-01-01
      • 2011-01-04
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多