Copie DataTable.Les lignes de DataRow[]. De façon plus rapide, puis Sélectionnez() avec les mêmes fonctionnalités?

J'ai maintenant un problème avec un très vieux système de la nôtre. (!Il est de plus de 7 ans et je n'ai pas de budget et de ressources pour faire de plus grands changements dans la structure, de sorte que la décision d'améliorer l'ancienne logique, autant que nous le pouvons.!)

Nous ont écrit gridcontrol. En gros, c'est comme un normal ASP.NET de la grille, vous pouvez ajouter, modifier, supprimer des éléments.

Le problème est que le réseau a une BindGrid() méthode, où pour une utilisation ultérieure, les lignes de la source de données tableau copié dans un DataRow[]. J'ai besoin de garder le DataRow[], mais je tiens à mettre en œuvre la meilleure façon de copier le source du tableau dans le tableau.

La solution actuelle:

DataRow[] rows = DataSource.Select("1=1", SortOrderString);

Comme je l'ai connu jusqu'à présent, si j'ai besoin d'obtenir un tri spécifié, qui pourrait être la meilleure façon (je suis également intéressé de savoir si il a un moyen plus rapide ou pas.)

MAIS il y a quelques pages simplifiées, où l'ordre de tri n'est pas nécessaire.

Pour que je puisse faire les deux une méthode pour l'ordre de tri et un pour sans.
Le vrai problème est la seconde:

 DataRow[] rows = DataSource.Select("1=1");

Car il est très lent. J'ai fait quelques test et il est une sorte de 15 fois plus lent puis le CopyTo() solution:

DataRow[] rows = new DataRow[DataSource.Rows.Count];
DataSource.Rows.CopyTo(rows,0);

Je voudrais utiliser le moyen plus rapide, MAIS quand j'ai fait les tests de certaines vieilles fonction simplement écrasé. Il semble, il y a une autre différence, ce que je ne remarque que maintenant:
Le Sélectionner() récupère les lignes comme la RowChanges sont acceptés.

Donc, si j'ai supprimé une ligne, et je n'utilise pas le AcceptRowChanges() (je ne peux pas le faire malheureusement), puis avec Select("1=1") la ligne est dans l' DataSource mais pas dans le DataRow[].

Avec un simple .CopyTo() la ligne est là, et c'est une mauvaise nouvelle pour moi.

Mes questions sont:

1) Est le Sélectionner("1=1") le meilleur moyen d'obtenir les lignes par le RowChanges? (J'en doute un peu, parce que c'est comme de 6 ans partie)

2) Et si 1) n'est pas, est-il possible d'obtenir un moyen plus rapide avec le même résultat que la .Sélectionnez("1=1") ?

Mise à JOUR:

Ici est très basique, en application de test, ce que j'ai utilisé pour speedtesting:

DataTable dt = new DataTable("Test");

dt.Columns.Add("Id", typeof (int));
dt.Columns.Add("Name", typeof(string));

for (int i = 0; i < 10000; i++)
{
    DataRow row = dt.NewRow();
    row["ID"] = i;
    row["Name"] = "Name" + i;
    dt.Rows.Add(row);
}

dt.AcceptChanges();
DateTime start = DateTime.Now;

DataRow[] rows = dt.Select();

/*DataRow[] rows = new DataRow[dt.Rows.Count];
dt.Rows.CopyTo(rows,0);*/

Console.WriteLine(DateTime.Now - start);
  • Vous pouvez appeler Select sans argument: DataRow[] allRows = DataSource.Select(); Qui serait à coup sûr plus efficace que "1=1" depuis que s'applique une inutile RowFilter. Un autre moyen est d'utiliser Linq-To-DataSet à l'ordre du filtre et de la DataTable. Ce n'est pas plus efficace mais plus lisible et maintanable.
  • Et est-ce plus rapide? Si oui pouvez-vous donner une réponse avec quelques explications, je suis curieux!