代码之家  ›  专栏  ›  技术社区  ›  bugfixr

数据视图。排序-不仅仅是asc/desc(需要自定义排序)

  •  14
  • bugfixr  · 技术社区  · 16 年前

    order by 
        case when field = 'Some Value' then 0 end
        case when field = 'Another Value' then 1 end
    

    基本上重新定义我的排序(即,某个值在另一个值之前)。

    是否有可能对DataView执行类似于排序表达式的操作?

    7 回复  |  直到 16 年前
        1
  •  17
  •   BFree    16 年前

    DataView .)

    你可以在原件上做这件事 DataTable 通过添加计算 DataColumn (使用 Expression

    DataColumn c = myTable.Columns.Add("Sort", typeof(int));
    c.Expression = "iif(field='SomeValue', 0, iif(field='AnotherValue', 1, 2))";
    

    哪种 SomeValue 第一, AnotherValue

        2
  •  17
  •   Robert Rossney    16 年前

    public static class DataTableExtensions
    {
        public static DataView ApplySort(this DataTable table, Comparison<DataRow> comparison)
        {
    
            DataTable clone = table.Clone();
            List<DataRow> rows = new List<DataRow>();
            foreach (DataRow row in table.Rows)
            {
                rows.Add(row);    
            }
    
            rows.Sort(comparison);
    
            foreach (DataRow row in rows)
            {
                clone.Rows.Add(row.ItemArray);
            }
    
            return clone.DefaultView;
        }
    
    
    }
    

        DataTable table = new DataTable();
        table.Columns.Add("IntValue", typeof(int));
        table.Columns.Add("StringValue");
    
        table.Rows.Add(11, "Eleven");
        table.Rows.Add(14, "Fourteen");
        table.Rows.Add(10, "Ten");
        table.Rows.Add(12, "Twelve");
        table.Rows.Add(13, "Thirteen");
    

    //按字符串值排序:

     DataView sorted = table.ApplySort((r, r2) =>
            {
                return ((string)r["StringValue"]).CompareTo(((string)r2["StringValue"]));
            });
    

    11十一

    13十三

    //按IntValue排序:

    DataView sorted = table.ApplySort((r, r2) =>
                {
                    return ((int)r["IntValue"]).CompareTo(((int)r2["IntValue"]));
                });
    

    11十一

    13十三

    12十二

    现在,在您的Lambda中(或者您可以创建一个完整的Comparison方法),您可以执行所需的任何类型的自定义排序逻辑。记住,-1小于,0等于,1大于。

        3
  •  5
  •   Stuart    13 年前

    public class Versioning : IComparable {
        string _version;
    
        int _major;
        public int Major { 
            get { return (_major); } 
            set { _major = value; } 
        }
    
        int _minor;
        public int Minor {
            get { return (_minor); }
            set { _minor = value; }
        }
    
        int _beta;
        public int Beta {
            get { return (_beta); }
            set { _beta = value; }
        }
    
        int _alpha;
        public int Alpha {
            get { return (_alpha); }
            set { _alpha = value; }
        }
    
        public Versioning(string version) {
            _version = version;
    
            var splitVersion = SplitVersion();
            if (splitVersion.Length < 4) {
                Major = Minor = Beta = Alpha = 0;
            }
    
            if (!int.TryParse(splitVersion[0], out _major)) _major = 0;
            if (!int.TryParse(splitVersion[1], out _minor)) _minor = 0;
            if (!int.TryParse(splitVersion[2], out _beta)) _beta = 0;
            if (!int.TryParse(splitVersion[3], out _alpha)) _alpha = 0;
        }
    
        string[] SplitVersion() {
            return (_version.Split('.'));
        }
    
        int GetCompareTo(Versioning versioning) {
            var greater = -1;
            var equal = 0;
            var less = 1;
    
            if (Major > versioning.Major) return (greater);
            if (Major < versioning.Major) return (less);
            if (Minor > versioning.Minor) return (greater);
            if (Minor < versioning.Minor) return (less);
            if (Beta > versioning.Beta) return (greater);
            if (Beta < versioning.Beta) return (less);
            if (Alpha > versioning.Alpha) return (greater);
            if (Alpha < versioning.Alpha) return (less);
    
            return (equal);
        }
    
        public int CompareTo(Versioning versioning) {
            return (GetCompareTo(versioning));
        }
    
        public override string ToString() {
            return (_version);
        }
    
        public int CompareTo(object obj) {
            if (obj == null) return (1);
            return (GetCompareTo((Versioning)obj));
        }
    }
    

    当您将该列添加到表中时,不是将Version添加为字符串,而是将其添加为Versioning类:

    _table.Columns.Add("Version", typeof(Versioning));
    _view = new View(_table);
    

    然后正常排序:

    _view.Sort = "Version";
    
        4
  •  1
  •   user53794    16 年前

    select
        (case when f = 'a' then 0 else 1 end) as CustomSort
    from MyTable
    
        5
  •  1
  •   REA_ANDREW    16 年前

    您可以使用if或switch语句来获得与select case语句类似的功能:

                if (Something == "1")
                    MyView.Sort = "Field1 ASC";
                else
                    MyView.Sort = "Field2 ASC";
    

                switch (MyProperty)
                {
                    case 1:
                        MyView.Sort = "Field1 ASC";
                        break;
                    case 2:
                        MyView.Sort = "Field2 ASC";
                        break;
                    default:
                        MyView.Sort = "Field3 ASC";
                        break;
                }