【问题标题】:Splitting of dataset based on number of rows in to multiple tables根据行数将数据集拆分为多个表
【发布时间】:2020-04-23 01:08:50
【问题描述】:

我有一种情况,我需要根据行数将数据集结果拆分为多个表,最终拆分为一个数组。 例如:我的数据集有 34 行和一个 url 列,我需要将 34 行拆分为 4 个数据表(10、10、10 剩余 4 个)并最终添加到一个数组中。我正在使用窗体 Windows 应用程序。 Itried 类似下面的东西,但是每次我将记录添加到数组时,它都会添加整个数据集。任何帮助将不胜感激。

 private DataSet Process(DataSet ds)
        {


            string[] Array1 = new string[10];
            string[] Array2 = new string[10];
            string[] Array3 = new string[10];
            string[] Array4 = new string[10];


            int COunt = ds.Tables[0].DefaultView.Count;
            int NoOfArraysToCreate = COunt/10 + 1;

            for (int i = 0; i <= NoOfArraysToCreate; i++ )
            {
                if (i == 0)
                {
                    foreach (DataRow drs in ds.Tables[0].Rows)
                    {
                        List<String> myList = new List<string>();
                        myList.Add(drs["Url"].ToString());
                        Array1 = myList.ToArray();
                    }
                }
                else if (i == 1)
                {
                    foreach (DataRow drs in ds.Tables[0].Rows)
                    {
                        List<String> myList = new List<string>();
                        myList.Add(drs["Url"].ToString());
                        Array2 = myList.ToArray();
                    }
                }
                else if (i == 2)
                {

                    foreach (DataRow drs in ds.Tables[0].Rows)
                    {
                        List<String> myList = new List<string>();
                        myList.Add(drs["Url"].ToString());
                        Array3 = myList.ToArray();
                    }
                }
                else if (i == 3)
                {

                    foreach (DataRow drs in dsURLsList.Tables[0].Rows)
                    {
                        List<String> myList = new List<string>();
                        myList.Add(drs["Url"].ToString());
                        Array4 = myList.ToArray();
                    }
                }

}

【问题讨论】:

  • 在所有 if 块中,您循环遍历数据表的所有行并从中创建数组。

标签: c# datatable dataset


【解决方案1】:

您似乎正在遍历每个页面的所有 DataTable 行。 我建议你只遍历你的行一次:

private List<List<string>> Process(DataSet ds, int pageSize)
{
    List<List<string>> result = new List<List<string>>();

    int COunt = ds.Tables[0].DefaultView.Count;
    int NoOfArraysToCreate = COunt / pageSize + 1;

    IEnumerable<DataRow> collection = ds.Tables[0].Rows.Cast<DataRow>(); //I find it easier to work with enumerables as it allows for LINQ expressions as below

    for (int i = 0; i < NoOfArraysToCreate; i++)
    {
        result.Add(collection.Skip(i*pageSize)
                .Take(pageSize)
                .Select(r => r["Url"].ToString())
                .ToList());
    }

    Parallel.ForEach(result, (page) =>
    {
        Parallel.ForEach(page, (url) => {}); // process your strings in parallel
    });

    return result;//I see you convert your string arrays back to DataSet, but since I don't know the table definition, I'm just returning the lists
}
void Main()
{
    // this is just a test code to illustrate my point, yours will be different
    var ds = new DataSet();
    var dt = new DataTable();
    dt.Columns.Add("Url", typeof(string));
    for (int i = 0; i < 34; i++) {
        dt.Rows.Add(Guid.NewGuid().ToString());//generating some random strings, ignore me
    }
    ds.Tables.Add(dt);
    //---------------------------------------
    Process(ds, 10);// calling your method
}

当然,也有使用 for 循环的方法,但我会留给你去探索。 我还要说将表编号硬编码到您的方法中通常被认为是代码异味,但是由于我不知道您的上下文,因此我不会做任何进一步的更改

【讨论】:

  • 我想在我的案例中拥有所有数据(URL),并使用 parallel.invoke 同时处理这些 URL,以加快检查它们状态的过程。目的是在数组中包含特定数据并将其作为参数传递给多个方法并同时调用它们。
  • 好吧,在这里,您将列表定义为 result[0]、result[1] 等等。如果您愿意,可以将它们转换回您的数组。
  • 我更新了答案,选择了如何同时处理结果。我想在这种情况下,您甚至不需要再拆分页面了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
相关资源
最近更新 更多