我有一个包含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年,我担心我没有得到答复。
任何人都可以建议一种方法来实现我需要使用此代码或新鲜事物吗?
答案 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]时,我得到“索引超出范围。必须是 非负面且小于集合的大小。参数名称: 索引“
如果列表只包含一个表,那么就会得到该异常,只有当行具有相同的列-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();