2016-07-28 4 views
3

Je travaille sur un projet hérité qui a été développé en utilisant .NET Framework 2.0. Dans ce projet, j'obtiens des valeurs distinctes de DataRowCollection par ItemNo colonne. Je ne suis intéressé que par ItemNo. Les DataRow consistent en ItemNo, Qty et Date.Récupère des valeurs distinctes d'une colonne de DataTable dans .NET 2.0

Je pense à itérer le DataRowCollection et en ajoutant le ItemNo unique, dans une liste de chaînes comme ci-dessous (non testé)

var items = new List<string>(); 
foreach (DataRow orderItem in rows) 
{ 
    var itemNo = orderItem["ITEMNO"].ToString().Trim(); 
    if(items.Find(delegate(string str) { return str == itemNo ;}) == null) 
    { 
      items.Add(itemNo); 
    } 
} 

est-il une meilleure façon de le faire sans LINQ (Net Framework 2.0 ne marche pas comme LINQ)

+0

Vous utilisez la méthode 'Contains' pour trouver' item spécifique' dans 'List'. 'if (! items.Contains (itemNo)) { articles.Ajouter (itemNo); } ' – mmushtaq

+0

pourquoi ne pas lancer n^2 sur votre collection et utiliser un dictionnaire pour vos articles – Didaxis

+0

Voulez-vous dire que vous avez besoin de valeurs distinctes de la colonne' ITEMNO'? –

Répondre

2
// Given a data table: 
var dt = new DataTable(); 
dt.Columns.Add("ITEMNO"); 
dt.Rows.Add("1 "); 
dt.Rows.Add(" 1"); 
dt.Rows.Add("2"); 

var dict = new Dictionary<string, bool>(); 

foreach(DataRow dr in dt.Rows) 
{ 
    var itemNo = dr["ITEMNO"].ToString().Trim(); 

    // Take advantage of O(1) lookup: 
    if (!dict.ContainsKey(itemNo)) 
    { 
     dict.Add(itemNo, true); 
    } 
} 

// Get list from dictionary keys: 
var items = new List<string>(dict.Keys); 

Si vous pouvez installer .Net 3.5 sur le serveur, et System.Core.dll de référence dans votre application, vous pouvez tirer parti HashSet qui modifierait le code ci-dessus:

var hashSet = new HashSet<string>(); 

foreach(DataRow dr in dt.Rows) 
{ 
    var itemNo = dr["ITEMNO"].ToString().Trim();  

    // Only unique elements are added to the hash set, 
    // no need to check for duplicates 
    hashSet.Add(itemNo);  
} 

var items = new List<string>(hashSet); 

L'avantage Il est vrai que l'utilisation de HashSet sur un dictionnaire est triviale, mais je le préférerais car je ne m'intéresse pas à la valeur arbitraire bool dans le dictionnaire, mais vous devez répondre aux conditions .Net 3.5 et référence.

1

Pour obtenir des valeurs distinctes forment une colonne, vous pouvez utiliser cette méthode:

List<T> SelectDistict<T>(DataTable table, string column) 
{ 
    DataTable temp = new DataView(table).ToTable(true, column); 
    List<T> items = new List<T>(); 
    foreach (DataRow row in temp.Rows) 
     items.Add(row.Field<T>(column)); 
    return items; 
} 

Dans la méthode ci-dessus je DataView.ToTable qui en passant true comme premier argument, sélectionne des valeurs distinctes.

Voici l'exemple d'utilisation:

List<string> items = SelectDistict<string>(yourDataTable, "ITEMNO"); 

Remarque

Si vous avez besoin de couper des valeurs, vous pouvez modifier le code ci-dessus et d'abord créer une copie de clone du DataTable. Ajoutez ensuite une colonne calculée qui contient la valeur tronquée du nom de colonne donné pour des valeurs distinctes en affectant la propriété TRIM(column) à Expression de la colonne. Ensuite, suivez les étapes en utilisant la nouvelle colonne ajustée comme ci-dessus.