根据列值拆分数据表

时间:2015-06-18 11:07:03

标签: c# list datatable

我有一个包含Bool(位)列的数据表。

  a         b
------    ------ 
  1         10
  0         20
  1         30
  0         20
  1         10 

我希望根据此值(列a)

将其拆分为2个可独立排序的数据表

我看了一眼并发现了一个老问题:

Split a DataTable into 2 or more DataTables based on Column value

这给了这个:

List<DataTable> result = myDataTable.AsEnumerable()
        .GroupBy(row => row.Field<Boolean>("a"))
        .Select(g => g.CopyToDataTable())
        .ToList();

但结果不是我可以使用result[0]result[1]引用的数据表列表,就像我预期的那样。

当我点击result[1]时,我得到:

  

&#34;指数超出范围。必须是非负的且小于大小   的集合。参数名称:index&#34;

我添加评论要求,但该帖子已超过2年,我担心我没有得到答复。

任何人都可以建议一种方法来实现我需要使用此代码或新鲜事物吗?

3 个答案:

答案 0 :(得分:1)

考虑到dt数据表包含所有记录(包括两列),您可以使用过滤条件创建两个DataView,如

EnumerableRowCollection<DataRow> query =
    from data in dt.AsEnumerable()
    where data.Field<bool>("a") == true 
    select data;

DataView view1 = query.AsDataView();



EnumerableRowCollection<DataRow> query1 =
    from data in dt.AsEnumerable()
    where data.Field<bool>("a") == false 
    select data;

DataView view2 = query1.AsDataView();

答案 1 :(得分:0)

您的结果 List<DataTable>。所以第一个表是result[0],第二个表是result[1]。它永远不会包含两个以上的表。

它可以包含

  • 如果源表为空,则为0表
  • 1表,如果它们都具有相同的值或
  • 如果包含两个值,则为2个表。

来自你的评论:

  

当我尝试访问结果[0]时,我得到了预期的缩短列表   结果。当我点击结果[1]时,我得到“索引超出范围。必须是   非负面且小于集合的大小。参数名称:   索引“

如果列表只包含一个表,那么就会得到该异常,只有当行具有相同的列-a值(f.e。全部都有1)时才会出现这种情况。

但如果你愿意,你可以使用另一种方法。这使用Lookup<TKey, TValue>

var aColLookup= myDataTable.AsEnumerable().ToLookup(row => row.Field<int>("a"));

DataTable trueTable = myDataTable.Clone();
DataTable falseTable = myDataTable.Clone();
if(aColLookup[1].Any())
    trueTable = aColLookup[1].CopyToDataTable();
if (aColLookup[0].Any())
    falseTable = aColLookup[0].CopyToDataTable();

我必须使用Clone(创建一个具有相同列的空表)和Any - 检查,因为如果序列不包含任何行,CopyToDataTable会抛出异常。

答案 2 :(得分:0)

 Globals.Productsdt = Pfdt.AsEnumerable()
                                            .Where(r => r.Field<string>("basecurve") == PFlist[j].PFBC.ToString())
                                            .Where(r => r.Field<string>("diameter") == PFlist[j].PFDM.ToString())
                                            .CopyToDataTable();
相关问题