Как заполнить ImageList из определенного столбца DataTable?
У меня есть DataTable, в котором сотни строк и много столбцов. Один из столбцов - "ImageThumbnail" Я хочу отобразить миниатюру в одном элементе управления на форме. Этот элемент управления ожидает "ImageList" в качестве источника изображения. Поэтому мне нравится, что мой элемент управления ImageList заполняется из столбца "ImageThumbnail" набора данных. Я мог бы сделать это, используя цикл по всем строкам в DataTable, но я считаю, что должен быть какой-то эффективный метод.
1 ответ
После быстрой попытки сделать это для себя, мне кажется, что это сводится к попытке получить значения из одного DataColumn
эффективным способом. После того, как я понял это, я нашел этот пост, который предложил 2 решения. Я применил это к моему тесту для ImageLists
и я включил свой код ниже:
DataTable dt = new DataTable();
dt.Columns.Add("Name", typeof(String));
dt.Columns.Add("Image", typeof(Image));
dt.Rows.Add("Img1", Properties.Resources.Img_1);
dt.Rows.Add("Img2", Properties.Resources.Img_2);
dt.Rows.Add("Img3", Properties.Resources.Img_3);
dt.Rows.Add("Img4", Properties.Resources.Img_4);
ImageList imgList = new ImageList();
//// Loop Approach:
//for (int idx = 0; idx < dt.Rows.Count; idx++)
//{
// imgList.Images.Add(dt.Rows[idx]["Image"] as Image);
//}
// LINQ Approach:
imgList.Images.AddRange(dt.Rows.Cast<DataRow>().Select(row => row["Image"] as Image).ToArray());
На мой взгляд, LINQ-подход более лаконичен, но Loop-подход, пожалуй, быстрее понимается и поэтому более читабелен. Я не уверен, какой из них будет более эффективным, или они оба получат схожий код IL. Тем не менее, подход LINQ использует AddRange
а также ToArray
встроенные методы, которые могут включать в себя повышение эффективности (или могут сделать в будущем).