基于列的值拆分数据表

问题描述 投票:0回答:3

我有一个包含布尔(位)柱的DataTable。

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

我希望该分裂成基于该值2个独立地排序数据表(A列)

我当时一看,发现了一个老问题:

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]我得到:

“索引超出范围必须为非负数且小于集合的大小参数名:索引”

我想补充注释要求,但该线程以及超过2岁,我怕我没有得到回应。

任何人都可以建议的方式来实现什么,我需要或者使用此代码或新鲜的东西?

c# list datatable
3个回答
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();

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检查。


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();

推荐问答