如何将IList转换为DataTable?

徐蕤 2005-02-17 02:28:33
我正在按照MSPetShop3的架构开发一个B/S应用程序。
我从BLL层获得了IList接口的数据,IList成员为我自定义的类(比如MyProduct),

将IList对象直接绑定到DataGrid是可以的,但是我想让DataGrid支持排序,而IList没有Sort方法。
所以我想将IList对象转换为DataTable,然后由该DataTable创建一个DataView,这样就可以获得DataView的Sort方法了。
可是我怎么才能将IList转换为DataTable?

进一步提问,
IList、ArrayList、DataTable……之间除了用遍历的方法,该如何转换?
...全文
649 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
徐蕤 2005-02-18
  • 打赏
  • 举报
回复
我认真研究了一下System.Collections下的一些类和接口,
暂时得出以下结论,并在没有转换为DataTable的前提下,实现了排序(逆序)。

首先,我的提问不够专业。“我从BLL层获得了IList接口的数据,IList成员为我自定义的类(比如MyProduct),”,事实上,IList只是接口

,IList的底层实现其实是ArrayList(PetShop3中的SQLServerDAL中可以证明),明确这一点,就好办了。
原来的提问其实就是ArrayList如何向DataTable转换的问题。

我有个前提是不用遍历的方法(在通过IList转递数据前,我用遍历创建了ArrayList,到了表示层又遍历一遍来获得DataTable,实在没有什么

理由让我这么做,但是的确遍历是无所不能的),所以问题又转换为如何对ArrayList进行排序。

感谢 saucer(思归) ,给了
http://www.c-sharpcorner.com/Language/IComparablePSD.asp
这样一个例子,让我对Sort有了信心。
这个例子是对普通的数组Array,通过实现IComparable接口的CompareTo方法实现排序。
然而,我得到的是可以动态增加的特殊数组对象ArrayList,所以必须进行转换

ArrayList arrayList = (ArrayList) myProduct.GetProducts(productID);
object[] temp = arrayList.ToArray();
Array.Sort(temp);
MyDataGrid.DataSource = arrayList;
MyDataGrid.DataBind();

以上代码需要在Model层中实现IComparable接口,并且ArrayList向Array转换后,数组元素成了Object,使用起来还要进行类型强制转换。另

外一个问题是,我无法对选择排序的成员。


所以,我决定放弃Array和IComparable接口,因为我发现ArrayList也有Sort方法,而且比IComparable更好的排序手段是转递一个

System.Collections.IComparer给Sort方法(Array和ArrayList都可以)。

具体实现如下:
我在Model层中的MyProductInfo类中加入下面一个类
public class MyComparer : IComparer
{
// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
private string _what;
private bool _desc = false;
public MyComparer(string what)
{
_what = what;
}
public MyComparer(string what, bool desc)
{
_what = what;
_desc = desc;
}
int IComparer.Compare(object m, object n)
{
MyProductInfo x = (MyProductInfo)m;
MyProductInfo y = (MyProductInfo)n;
int returnValue;
switch(_what)
{
case "ProductID":
returnValue = (x.ProductID>y.ProductID?1:(x.ProductID==y.ProductID?0:-1));
break;
case "ProductSum":
returnValue = (x.ProductSum>y.ProductSum?1:(x.ProductSum==y.ProductSum?0:-1));
break;
case "ProductName":
returnValue = (String.Compare(x.ProductName,y.ProductName));
break;
/*其他需要排序的属性*/
default:
returnValue = (x.ProductID>y.ProductID?1:(x.ProductID==y.ProductID?0:-1));
break;
};
if(_desc)returnValue = -returnValue;
return(returnValue);
}
}

_desc的加入是为了产生逆序。

然后在表示层这样调用:
private void BindData()
{
long productID = 1; //just a test productID
MyProduct myProduct = new MyProduct();
ArrayList arrayList = (ArrayList) myProduct.GetProducts(productID);
IComparer myComparer = new MyProductInfo.MyComparer("ProductName",true);
arrayList.Sort(myComparer);

MyDataGrid.DataSource = arrayList;
MyDataGrid.DataBind();
}

当然啦,我后来通过编写MyDataGrid_SortCommand方法实现了任意字段的顺序、逆序,以及在Session暂存ArrayList提高效率就不提了。
以上代码是我以MyProduct作为示例改写过的,其实我要写的应用程序不是购物的。

总之以上代码达到了我的目的,我可以安心睡觉了,我搜索过CSDN以前的文章,也有类似提问,总之没有一个像样的解答。我把我的收获回馈

给大家,希望后来者不要走弯路。也非常感谢前面热心的朋友,没有你们的抛砖引玉,我也无法继续下去。

问题还没有结束,那就是DataTable与Array,ArrayList……之间,除了用遍历的办法真的无法互相转换了吗?
求高手解答,我暂时不结贴。
噯卟釋手 2005-02-17
  • 打赏
  • 举报
回复
up
nga96 2005-02-17
  • 打赏
  • 举报
回复
不会只有这一种办法吧,其它的我还不知道的
jhjhzr 2005-02-17
  • 打赏
  • 举报
回复
用DataTable的Row.addrow()试试!
liulxmooo 2005-02-17
  • 打赏
  • 举报
回复
up
jan1010 2005-02-17
  • 打赏
  • 举报
回复
DataTable dt = new DataTable();
dt = (DataTable)IList;
yizhixiaozhu 2005-02-17
  • 打赏
  • 举报
回复

lovelxj 2005-02-17
  • 打赏
  • 举报
回复
遍历 就不错了呀。。
NekChan 2005-02-17
  • 打赏
  • 举报
回复
IList也是可以自己添加排序上去的
代码如下:
public void Sort(TemplateComparer.ComparisonType ctype)
{
TemplateComparer tmpCompate = new TemplateComparer();
tmpCompate.WhichComparison = (int)ctype;
this.InnerList.Sort(tmpCompate);
}
TemplateComparer是继承自IComparer的一个类。
mymailyy 2005-02-17
  • 打赏
  • 举报
回复
然后用DataTable的Row.addrow()试试!
mymailyy 2005-02-17
  • 打赏
  • 举报
回复
你的数组是放的对象,一个对象就是一条记录呀 对数组进行强类型,然后遍历,然后
内容概要:本文系统研究了构网型变流器的正负序阻抗解耦特性及其在弱电网环境下的稳定性表现,重点依托Matlab/Simulink仿真平台,构建了详细的阻抗数学模型,设计了解耦控制策略,并采用小信号扫频法进行频域辨识与稳定性验证。研究深入探讨了构网型变流器与传统跟网型逆变器在正负序阻抗特性上的本质差异,结合虚拟同步发电机(VSG)等先进控制技术,分析其在抑制宽频带振荡、削弱锁相环动态耦合等方面的优越性。文中不仅提供了完整的仿真模型与MATLAB代码实现,还整合了光伏、风电、储能、微电网等多类新能源系统的阻抗建模与稳定性分析资源,形成了一套面向新型电力系统稳定性的综合性技术资料体系,具有较强的科研复现与工程参考价值。; 适合人群:面向具备电力电子、电力系统自动化、新能源并网等专业背景的研究生、高校教师及工程技术人员,特别适用于从事阻抗建模、小干扰稳定性分析、宽频振荡机理研究以及撰写高水平学术论文的科研工作者。; 使用场景及目标:①掌握构网型变流器正负序阻抗建模与扫频辨识的仿真方法;②深入理解VSG等构网型控制在弱电网中提升稳定性的内在机理;③复现顶刊论文中的阻抗分析流程与稳定性判据应用;④利用提供的成熟模型与代码加速科研进程,支撑课题研究与学术成果产出。; 阅读建议:建议结合文中提供的Simulink模型与MATLAB代码,按照“理论建模—仿真搭建—扫频激励—频响提取—Nyquist判据分析”的完整流程进行实践操作,重点关注扫频信号的注入方式、频率范围设置及阻抗曲线的物理意义解读,并参考博士论文复现案例深化对复杂动态耦合问题的理解。

62,272

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧