Как заполнить 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 встроенные методы, которые могут включать в себя повышение эффективности (или могут сделать в будущем).

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