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