1. C# / Говнокод #19669

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    public class ResultBase {
            private ColumnCollections _columns;
            private ArrayList _rows;
    ...
    }
    ...
    public class ColumnCollections : System.Collections.Specialized.NameObjectCollectionBase {}
    ...
            public int Compare(object x, object y) {
                if (x != null && y != null) {
                    object[] objX = x as object[];
                    object[] objY = y as object[];
    
                    if (objX != null && objY != null && objX.Length > 0 && objX.Length == objY.Length) {
                        switch (_ColumnType.FullName) {
                            case "System.Int16":
                                if (_Direction == DirectionType.ASC) {
                                    return ((short)objX[_ColumnIndex]).CompareTo((short)objY[_ColumnIndex]);
                                } else {
                                    return ((short)objY[_ColumnIndex]).CompareTo((short)objX[_ColumnIndex]);
                                }
                            case "System.Int32":
                                if (_Direction == DirectionType.ASC) {
                                    return ((int)objX[_ColumnIndex]).CompareTo((int)objY[_ColumnIndex]);
                                } else {
                                    return ((int)objY[_ColumnIndex]).CompareTo((int)objX[_ColumnIndex]);
                                }
                            case "System.Int64":
                                if (_Direction == DirectionType.ASC) {
                                    return ((long)objX[_ColumnIndex]).CompareTo((long)objY[_ColumnIndex]);
                                } else {
                                    return ((long)objY[_ColumnIndex]).CompareTo((long)objX[_ColumnIndex]);
                                }
                            case "System.Double":
                                if (_Direction == DirectionType.ASC) {
                                    return ((double)objX[_ColumnIndex]).CompareTo((double)objY[_ColumnIndex]);
                                } else {
                                    return ((double)objY[_ColumnIndex]).CompareTo((double)objX[_ColumnIndex]);
                                }
                            case "System.Decimal":
                                if (_Direction == DirectionType.ASC) {
                                    return ((decimal)objX[_ColumnIndex]).CompareTo((decimal)objY[_ColumnIndex]);
                                } else {
                                    return ((decimal)objY[_ColumnIndex]).CompareTo((decimal)objX[_ColumnIndex]);
                                }
                            case "System.Single":
                                if (_Direction == DirectionType.ASC) {
                                    return ((float)objX[_ColumnIndex]).CompareTo((float)objY[_ColumnIndex]);
                                } else {
                                    return ((float)objY[_ColumnIndex]).CompareTo((float)objX[_ColumnIndex]);
                                }
                            case "System.String":
                                String sX = (!Convert.IsDBNull(objX[_ColumnIndex])) ? (String)objX[_ColumnIndex] : String.Empty;
                                if (String.IsNullOrEmpty(sX)) {
                                    sX = "";
                                }
    
                                String sY = (!Convert.IsDBNull(objY[_ColumnIndex])) ? (String)objY[_ColumnIndex] : String.Empty;
                                if (String.IsNullOrEmpty(sY)) {
                                    sY = "";
                                }
    
                                if (_Direction == DirectionType.ASC) {
                                    return sX.CompareTo(sY);
                                } else {
                                    return sY.CompareTo(sX);
                                }
                            case "System.DateTime":
                                if (_Direction == DirectionType.ASC) {
                                    return ((DateTime)objX[_ColumnIndex]).CompareTo((DateTime)objY[_ColumnIndex]);
                                } else {
                                    return ((DateTime)objY[_ColumnIndex]).CompareTo((DateTime)objX[_ColumnIndex]);
                                }
                            case "System.Boolean":
                                if (_Direction == DirectionType.ASC) {
                                    return ((Boolean)objX[_ColumnIndex]).CompareTo((Boolean)objY[_ColumnIndex]);
                                } else {
                                    return ((Boolean)objY[_ColumnIndex]).CompareTo((Boolean)objX[_ColumnIndex]);
                                }
                        }
                    }
                }
    
    
                return 0;
            }

    достался мне в наследство код, который я года два поддерживал. никогда не вдавался в код той тулзы, которая из базы результаты возвращяла, пока не пришлось описать проект комментариями, чтобы отдать его клиенту.
    компарер просто божественен...
    я конечно точно не знаю, кто это писал, но за то знаю, кому пренадлежил авторство конкретной версии, но за то знаю, кто писал первую... и этот человек мне еще говорил, что мой экстеншен в 50 строк, который через рифлексию миллион строк из IDataReader за секунду в коллекцию объектов возвращял, уверял меня, что это медленное и корявое говно. нет, это медленное и корявое говно!

    господи, за что?

    Запостил: Lokich, 21 Марта 2016

    Комментарии (7) RSS

    • За то есть рифлексивное чя-щя. Так что - всё в порядке. Не беспокойтесь.
      Ответить
    • >>  if (_Direction == DirectionType.ASC) {
      >> return ((short)objX[_ColumnIndex]).CompareTo((short)objY[_ColumnIndex]); } else {
      >> return ((short)objY[_ColumnIndex]).CompareTo((short)objX[_ColumnIndex]); }


      Во дворе переворот - лысый лысого ебет
      А потом наоборот - лысый лысого ебет

      Да еще и null pointer exception кидает как бешеный
      Ответить
      • я в принципе этой сортировки не нашел, но то, что они в ArrrayList положили другой ArrayList, меня мягко говоря напрягает

        они там по 5к записей выгружают, и присваивают значения через
        if (Bi.Data.Validate.IsDataColumnExist(rc[idx], "DictionaryId")) {
                        this.DictionaryId = (Guid?)Bi.Data.Validate.NullIsDBNull(rc[idx].Value("DictionaryId", i));
                    }
        и так обрабатывается каждое поле! я как дизассемблером открыл, там unbox через строчку
        неужели он правда считает, что 200+ строк для обработки каждой сущности лучше чем
        protected static List<T> Fill<T>(IDataReader reader) where T : new(){
                    Dictionary<string, int> columns = new Dictionary<string, int>();
        
                    for (int i = 0; i < reader.FieldCount; i++) {
                        columns[reader.GetName(i)] = i;
                    }
                    Type type = typeof(T);
                    PropertyInfo[] props = type.GetProperties();
        
                    List<T> list = new List<T>();
                    while (reader.Read()) {
                        T item = new T();
                        foreach (PropertyInfo p in props) {
                            if (columns.Keys.Contains(p.Name)) {
                                if (p.PropertyType.IsEnum) {
                                    p.SetValue(item, (reader[p.Name] is System.DBNull) ? null : Enum.Parse(p.PropertyType, reader[p.Name].ToString()));
                                } else {
                                    p.SetValue(item, (reader[p.Name] is System.DBNull) ? null : reader[p.Name]);
                                }
                            }
                        }
                        list.Add(item);
                    }
                    return list;
                }
        Ответить
        • >> Bi.Data.

          автор - бисексуал?
          Ответить
          • Business intelligence (сокращённо BI) — это методы и инструменты для перевода необработанной информации в осмысленную, удобную форму. Эти данные используются для бизнес-анализа. Технологии BI обрабатывают большие объемы неструктурированных данных, чтобы найти стратегические возможности для бизнеса.
            Ответить
            • Так вот почему продукт MS на основе студии для работы с SSAS называется "бизнес интеллиджент"
              Ответить
    • в всё потому что свитч по строкам есть
      не было бы свича -- был бы цепочка проверок на тип
      Ответить

    Добавить комментарий