2016-07-28 13 views
3

Я работаю над унаследованным проектом, который был разработан с использованием .NET Framework 2.0. В этом проекте я получаю отличные значения от DataRowCollection от ItemNo. Меня интересует только ItemNo. DataRow состоит из ItemNo, Qty и Date.Получить отдельные значения из столбца DataTable в .NET 2.0

Я имею в виду итерируя DataRowCollection и добавление уникального ItemNo в списке строки, как показано ниже (не тестировалось)

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); 
    } 
} 

Есть ли лучший способ сделать это без LINQ (.Net Framework 2.0 оленья кожа как LINQ)

+0

вы используете метод 'Содержит', чтобы найти' специфический элемент' из 'List'. 'if (! items.Contains (itemNo)) { items.Add (itemNo); } ' – mmushtaq

+0

как насчет того, чтобы не запускать n^2 в вашей коллекции и использовать словарь для ваших предметов. – Didaxis

+0

Вы имеете в виду, что вам нужны отличительные значения из колонки' ITEMNO'? –

ответ

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); 

Если вы можете установить .NET 3.5 на сервере, а также ссылки System.Core.dll в вашем приложении, вы можете использовать HashSets, который будет изменять приведенный выше код:

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); 

на благо использования HashSet над Словарем, по общему признанию, тривиальным, но я бы предпочел это, так как я не забочусь о произвольном значении bool в словаре, но вам нужно будет встретить .Net 3.5 и ссылочные реквизиты.

1

Чтобы получить различные значения образуют столбец вы можете использовать этот метод:

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; 
} 

в вышеуказанном способе я использовал DataView.ToTable, который, передавая true в качестве первого аргумента, выбирает различные значения.

Вот пример использования:

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

Примечание

Если вам нужно обрезать значения, вы можете изменить выше код и сначала создать клон копию DataTable. Затем добавьте вычисленный столбец, который содержит, обрезанное значение из данного имени столбца для разных значений, присваивая TRIM(column)Expression свойство столбца. Затем выполните шаги, используя новый обрезанный столбец, например, код выше.