Получить различные значения из столбца DataTable в.NET 2.0

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

Я думаю об итерации 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)

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 и ссылочным реквизитам.

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

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 свойство столбца. Затем следуйте инструкциям, используя новый обрезанный столбец, как показано выше.

Другие вопросы по тегам