List 组合排序 请给简单源代码

_三皮_ 2008-01-14 05:11:58
现有List<Matter>=new List<Matter>
Matter中的属性有
ProviderName
MaClass
MaName
MaSize
如果要求将List中的数据按照ProviderName,MaClass,MaName,MaSize的顺序排列
代码要如何写
...全文
81 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
he_8134 2008-01-15
  • 打赏
  • 举报
回复
Linq
两三行搞定。。。
_三皮_ 2008-01-15
  • 打赏
  • 举报
回复
我是数据库表->实体类->List->界面grid控件, 控件不能组合排序,实体类比表有多个扩展字段,实体类的属性特别多。排序字段和顺序是经常变化的,速度也要可以忍受(按点击grid的列头顺序进行组合排序)。要实现组合排序,有没有方案?
如果改为数据源直接绑表,代价太大了,又不是oo,维护也不方便。
changjiangzhibin 2008-01-14
  • 打赏
  • 举报
回复
呵呵
he_8134 2008-01-14
  • 打赏
  • 举报
回复
随便写写~仅供参考~~

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
public class Matter
{
public string ProviderName;
public int MaClass;
public string MaName;
public int MaSize;
public override string ToString()
{
return string.Format("ProviderName:{0},MaClass:{1},MaName:{2},MaSize:{3}", ProviderName, MaClass, MaName, MaSize);
}
}
public enum MatterComparerType {
ProviderName, MaClass, MaName, MaSize
}
public enum SortOder {
Ascending,Descending
}
public class MatterComparer : IComparer<Matter>
{
public MatterComparerType Orderby;
public SortOder Order;
public MatterComparer(MatterComparerType orderby,SortOder order)
{
this.Orderby = orderby;
this.Order = order;
}
int CompareByProviderName(Matter x, Matter y) {
if (Order == SortOder.Ascending) return string.Compare(y.ProviderName, x.ProviderName);
return string.Compare(x.ProviderName, y.ProviderName);
}
int CompareByMaClass(Matter x, Matter y) {
if (Order == SortOder.Ascending) return y.MaClass - x.MaClass;
return x.MaClass - y.MaClass;
}
int CompareByMaName(Matter x, Matter y) {
if (Order == SortOder.Ascending) return string.Compare(y.MaName, x.MaName);
return string.Compare(x.MaName, y.MaName);
}
int CompareByMaSize(Matter x, Matter y) {
if (Order == SortOder.Ascending) return y.MaSize - x.MaSize;
return x.MaSize - y.MaSize;
}
#region IComparer<Matter> 成员

public int Compare(Matter x, Matter y)
{
switch (this.Orderby) {
case MatterComparerType.ProviderName: return CompareByProviderName(x, y);
case MatterComparerType.MaClass: return CompareByMaClass(x, y);
case MatterComparerType.MaName: return CompareByMaName(x, y);
case MatterComparerType.MaSize: return CompareByMaSize(x, y);
}
return 0;
}

#endregion
}
class Program
{
static void Main(string[] args)
{
List<Matter> list = new List<Matter>();
Matter m = new Matter();
m.ProviderName = "MS1";
m.MaClass = 111;
m.MaName = "CK5";
m.MaSize = 123;
list.Add(m);
m = new Matter();
m.ProviderName = "MS2";
m.MaClass = 13;
m.MaName = "CK4";
m.MaSize = 12213;
list.Add(m);
m = new Matter();
m.ProviderName = "MS3";
m.MaClass = 12;
m.MaName = "CK3";
m.MaSize = 1233;
list.Add(m);
m = new Matter();
m.ProviderName = "MS3";
m.MaClass = 1;
m.MaName = "CK2";
m.MaSize = 1123;
list.Add(m);
m = new Matter();
m.ProviderName = "MS5";
m.MaClass = 23;
m.MaName = "CK1";
m.MaSize = 123;
list.Add(m);
MatterComparer mc1 = new MatterComparer(MatterComparerType.MaSize,SortOder.Descending);
MatterComparer mc2 = new MatterComparer(MatterComparerType.MaName, SortOder.Descending);
MatterComparer mc3 = new MatterComparer(MatterComparerType.MaClass, SortOder.Descending);
MatterComparer mc4 = new MatterComparer(MatterComparerType.ProviderName, SortOder.Descending);
list.Sort(mc1);
list.Sort(mc2);
list.Sort(mc3);
list.Sort(mc4);
foreach (Matter ma in list)
{
Console.WriteLine(ma);
}
Console.Read();
}
}
}

TNT_1st_excellence 2008-01-14
  • 打赏
  • 举报
回复
你List里面的资料是绑定数据库的吗?如果是,new DataView 先把DataTable里面的资料按照ProviderName,MaClass,MaName,MaSize的顺序排列就可以了,然后用DataView 绑定List,可能我的理解跟你讲得有偏差。
haiwangstar 2008-01-14
  • 打赏
  • 举报
回复
simply use List.Sort ,but before use List.Sort ,you should let Matter implement IComparer interface

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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