Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сортировка dataSet

6.0K
03 декабря 2008 года
Balda
79 / / 12.05.2008
Пишу в MS VS .NET 2003.
Нужно отсортировать данные в dataSet по значению первого столбца.
Пробую реализовать это так:
Код:
private void Sort(System.Data.DataSet ds)      
{          
  System.Data.DataRow dr;
       
for(int i=0; i<ds.Tables[0].Rows.Count;i++)
  for(int j=i; j<ds.Tables[0].Rows.Count-1;j++)
     if((System.DateTime)ds.Tables[0].Rows[j][0]>(System.DateTime)ds.Tables[0].Rows[j+1][0])
    {              
      dr = ds.Tables[0].Rows[j];
                           
      for(int k=0;k<ds.Tables[0].Columns.Count;k++)
      {
                         ds.Tables[0].Columns[k].ReadOnly = false;
        ds.Tables[0].Rows[j][k] = ds.Tables[0].Rows[j+1][k];
        dr.RejectChanges();
        ds.Tables[0].Rows[j+1][k] = dr[k];
      }
    }
                   
}


Чтобы поменять строки dataSet местами надо куда-то сохранять одну из них. Я сохраняю в dataRow
 
Код:
dr = ds.Tables[0].Rows[j];

Но тогда возникает проблема: при изменении dataSet изменяеться также и dataRow, а при отмене изменений в dataRow
 
Код:
dr.RejectChanges();

отменяються и изменения в dataSet. В результате данные не сортируються.
Как быть?
341
05 декабря 2008 года
Der Meister
874 / / 21.12.2007
Код:
struct RowEntry : IComparable<RowEntry>
{
    public RowEntry(DataRow row, IComparable key)
    {
        this.Row = row;
        this.Key = key;
    }

    public DataRow Row;
    public IComparable Key;

    public int CompareTo(RowEntry other)
    {
        return Key.CompareTo(other.Key);
    }
}

List<RowEntry> list = new List<RowEntry>(table.Rows.Count);
foreach (DataRow row in table.Rows)
{
    RowEntry entry = new RowEntry(row, row[0]);
    list.Add(entry);
}

list.Sort();
Либо даже не List<RowEntry>, а RowEntry[]
341
05 декабря 2008 года
Der Meister
874 / / 21.12.2007
Хотя... Параметризованные классы вроде в однопервом фремворке не поддерживаются, но можно заменить IComparable<T> на IComparable, а в RowEntry.CompareTo() явно приводить аргумент к RowEntry:
 
Код:
public int CompareTo(object other)
{
    RowEntry comparand = (RowEntry) other;
    return Key.CompareTo(comparand.Key);
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог