我有一个包含布尔(位)柱的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岁,我怕我没有得到回应。
任何人都可以建议的方式来实现什么,我需要或者使用此代码或新鲜的东西?
考虑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();
你的结果是List<DataTable>
。因此,第一个表是result[0]
和第二表是result[1]
。它决不会包含两个以上的表。
它可以包含
从您的评论:
当我尝试访问结果[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
检查。
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();