当前位置: 首页 > 编程语言 > C#

DataView.Sort-notjustasc-desc(需要自定义排序)share

时间:2023-04-10 16:38:06 C#

DataView.Sort-notjustasc/desc(需要自定义排序)我有一个从数据集构建的报告。数据集使用排序属性对数据进行排序。我知道我可以创建这样的排序表达式:"fielddesc,field2asc"但我现在需要的是一种自定义排序的方法。在SQL中,我可以通过以下方式进行自定义排序:orderbycasewhenfield='SomeValue'then0endcasewhenfield='AnotherValue'then1end基本上重新定义我的排序(即,一些值出现在另一个之前价值)。是否可以在DataView上执行类似于排序表达式的操作?好吧,我只是快速打开它,并没有做所有必要的错误处理和null检查,但它应该给你一个想法并且应该足以让你开始:publicstaticclassDataTableExtensions{publicstaticDataViewApplySort(thisDataTabletable,比较comparison){DataTableclone=table.Clone();列表行数=newList();foreach(DataRowrowintable.Rows){rows.Add(row);}rows.Sort(比较);foreach(DataRow行中的行){clone.Rows.Add(row.ItemArray);}返回clone.DefaultView;}}用法:DataTabletable=newDataTable();table.Columns.Add("IntValue",typeof(int));table.Columns.Add("StringValue");table.Rows.Add(11,"十一");table.Rows.Add(14,"十四");table.Rows.Add(10,"十");table.Rows.Add(12,"十二");table.Rows.Add(13,"十三");//按字符串值排序:DataViewsorted=table.ApplySort((r,r2)=>{return((string)r["StringValue"]).CompareTo(((string)r2["StringValue"]));});结果:11111414101013131212//按IntValue排序:DataViewsorted=table.所以申请rt((r,r2)=>{return((int)r["IntValue"]).CompareTo(((int)r2["IntValue"]));});结果:1010111113103121214编辑:将此更改为扩展方法现在在您的Lambda中(或者您可以创建一个完整的比较方法),您可以执行任何您需要的自定义排序逻辑。请记住,-1小于,0等于,1大于。我喜欢BFree的回答,尽管我担心我的代码最终更新克隆表而不是实际代码的风险。(如果您只是在DataView上使用扩展方法,我还没有想过这是否真的是一个问题。)您可以通过向其添加计算的DataColumn(使用Expression属性)在原始DataTable上执行此操作,然后对其值进行排序。在您的情况下,它将是这样的:DataColumnc=myTable.Columns.Add("Sort",typeof(int));c.Expression="iif(field='SomeValue',0,iif(field='AnotherValue',1,2))";首先对AnotherValue进行排序,然后对AnotherValue进行排序,然后进行所有其他排序。我知道这篇文章有点旧,但我通过实施IComparable解决了这个问题。在此示例中,我想按版本排序(格式为0.0.0.0作为字符串)。这是实现IComparable的版本控制类:publicclassVersioning:IComparable{string_version;国际专业;publicintMajor{get{return(_major);}设置{_major=值;}}诠释_minor;publicintMinor{get{return}set{_minor=value;}}诠释_beta;publicintBeta{get{return(_beta);}设置{_beta=值;}}诠释_alpha;publicintAlpha{get{return(_alpha);}设置{_alpha=值;}}publicVersioning(stringversion){_version=version;varsplitVersion=SplitVersion();如果(splitVersion.Lengthversioning.Major)返回(更大);如果(主要版本控制。次要)返回(更大);if(Minorversioning.Beta)return(greater);if(Betaversioning.Alpha)return(greater);if(Alpha当您将列添加到表中时,不是将Version添加为字符串,而是将其添加为Versioningclass:_table.Columns.Add("Version",typeof(Versioning));_view=newView(_table);然后正常排序:_view.Sort="Version";我不这么认为。但是,您可以更改SQL以返回“CustomSort”列作为case语句的结果:select(casewhenf='a'then0else1end)asCustomSortfromMyTable您可以使用if或switch语句来得到和selectcase语句一样的功能类似:if(Something=="1")MyView.Sort="Field1ASC";elseMyView.Sort="Field2ASC";以上就是C#学习教程:DataView.Sort-notjustasc/desc(如果需要自定义排序)所有内容分享,如果对你有用又需要了解更多C#学习教程,我希望大家多多关注---switch(MyProperty){case1:MyView.Sort="Field1ASC";休息;案例2:MyView.Sort="Field2ASC";休息;默认值:MyView.Sort="Field3ASC";休息;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: