【问题标题】:How can i fill my array from whole cells of datatable?如何从数据表的整个单元格中填充我的数组?
【发布时间】:2010-06-19 14:24:27
【问题描述】:

我在下面创建了一个数据表,我需要在数据表中列出所有行的单元格长度。我的结果必须不包括“0”值。但是我的列表:19,19,19,19,19, 0.0.0.0..0.0.....等等为什么会这样?如何查看数组的长度?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace DataTables
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable table = GetTable();
            int[] mySortedLists = new int[table.Rows.Count*table.Columns.Count];
            foreach (DataColumn dc in table.Columns)
            {
                foreach (DataRow dr in table.Rows)
                {
                    Console.WriteLine(dr[dc].ToString().Length);
                }
                Console.WriteLine("\t");
            }

            Console.WriteLine("--------------------------------------");

            for (int i = 0; i < table.Rows.Count; i++)
           {
                for (int j = 0; j < table.Columns.Count; j++)
                {
                    mySortedLists[i] += table.Rows[i][j].ToString().Length;
                }
            }

            foreach (var mySortedList in mySortedLists)
            {
                Console.WriteLine(mySortedList.ToString() + "\n");
            }

            Console.ReadKey();
        }

        static DataTable GetTable()
        {
            //
            // Here we create a DataTable with four columns.
            //
            DataTable table = new DataTable();
            table.Columns.Add("Dosage", typeof(int));
            table.Columns.Add("Drug", typeof(string));
            table.Columns.Add("Patient", typeof(string));
            table.Columns.Add("Date", typeof(DateTime));

            //
            // Here we add five DataRows.
            //
            table.Rows.Add(25, "Indocin", "David", DateTime.Now);
            table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
            table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
            table.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
            table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);

            return table;
        }
    }
}

请帮帮我!

【问题讨论】:

    标签: c# .net visual-studio visual-studio-2008


    【解决方案1】:

    您声明 mySortedLists 的长度为 table.Rows.Count * table.Columns.Count,但您只使用第一个 table.Rows.Count 条目。如果您想要每行一个长度值,那么您可能想要:

    int[] mySortedLists = new int[table.Rows.Count];
    

    或者,如果您希望每个单元格有一个长度值,那么您需要一个二维数组:

    int[,] mySortedLists = new int[table.Rows.Count, table.Columns.Count];
    ...
    mySortedLists[i, j] += table.Rows[i][j].ToString().Length;
    

    或者你想展平数组索引:

    mySortedLists[i * table.Columns.Count + j] += table.Rows[i][j].ToString().Length;
    

    【讨论】:

      【解决方案2】:

      除非我误解了您要完成的工作,否则您的问题在于您如何声明 mySortedLists 数组。你希望它像这样声明它:

      int[] mySortedLists = new int[table.Rows.Count];
      

      要查看数组的长度,可以使用

      Console.WriteLine(mySortedLists.Length);
      

      【讨论】:

        【解决方案3】:

        我不知道您是要获取每行单元格的总长度,还是每行中每个单元格的单独长度。您的数组声明的长度将支持后一种情况,但您只是为前一种情况分配值。这里有两种获取存储长度值的 Linq 方法,第一种是将长度放入一个锯齿状数组中,该数组将具有每个字段的长度。

        int[][] lengths;
        
        using (DataTable table = GetTable())
        {
            lengths = (from DataRow row in table.Rows
                        select
                        (from DataColumn col in table.Columns
                        select row[col].ToString().Length).ToArray()).ToArray();
        }
        
        foreach (int[] row in lengths)
        {
            Console.WriteLine(string.Join(",", row));
        }
        

        第二个开始相同,但在第一个 .ToArray() 之前的末尾执行聚合,因此它获取每个单独行的总长度并将其存储在一个数组中。

        int[] array;
        
        using (DataTable table = GetTable())
        {
            array = (from DataRow row in table.Rows
                        select
                        (from DataColumn col in table.Columns
                        select row[col].ToString().Length).Sum()).ToArray();
        }
        
        foreach (int value in array)
            Console.WriteLine(value);
        

        【讨论】:

        • Console.WriteLine(string.Join(", ", row .. . .. has invalid arguments?
        • @Phsika,这在 .NET 4 中有效。在 3.5 的土地上,你可以做类似Console.WriteLine(string.Join(",", row.Select(i =&gt; i.ToString()).ToArray()));
        猜你喜欢
        • 2013-11-10
        • 2019-12-09
        • 1970-01-01
        • 2011-03-14
        • 2020-07-14
        • 2017-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多