Wednesday, 4 April 2012

Comparing Byte Arrays with Linq

This morning I ran into a small issue. I needed to extract a series of images from a database table. The problem I had was there were duplicate images in the database table and I needed a unique set of images written to disk. To filter the duplicates I have used the Enumerable.SequenceEqual linq operator. So here is how I did it.
using (var sqlConnection = new SqlConnection(connectionString))
{
 sqlConnection.Open();

 foreach (var deliveryNumber in deliveryNumbers)
 {
  
  var images = new List<byte[]>();

  // get all ewtphotos for this sapdeliverynumber 
  using (var sqlCommand = new SqlCommand())
  {
   sqlCommand.Connection = sqlConnection;
   sqlCommand.CommandType = CommandType.Text;
   sqlCommand.CommandText = "select imagedata " +
          "from delivery d " +
          "inner join image i on d.imageid=i.imageid " +
          "where d.deliverynumber='" + sapDeliveryNumber + "'";
   using (var sqlDataReader = sqlCommand.ExecuteReader())
   {
    while (sqlDataReader.Read())
    {
     var imageData = (byte[])sqlDataReader["ImageData"];

     var imageExists = images.Any(image => image.SequenceEqual(imageData));
     if (!imageExists) images.Add(imageData);

    }
   }

  }
  WriteImagesToDisk(sapDeliveryNumber, images);
 }

}

private static void WriteImagesToDisk(string deliveryNumber, List<byte[]> images)
{
 var counter = 1;
 foreach (var image in images)
 {
  var fileFullName = @"images\DeliveryNumber_" + deliveryNumber + "_" + counter + ".jpg";
  File.WriteAllBytes(fileFullName, image);
  counter++;
 }
}

1 comment: