ShaHam11 Ответов: 1

Как получить значения из словаря в DataTable


Привет

У меня есть список данных, собранных при обходе файла блокнота и хранении его в словаре, и, наконец, я печатаю вывод в консоли. Теперь мне нужно взять эти данные в datatable и затем распечатать их. Может ли кто-нибудь подсказать мне, как это сделать или достичь?

Мой код
static void unzip()
  {
      try
      {
          int counter = 1;
          var files = new List<string>(Directory.GetFiles(path, "*.zip*", SearchOption.AllDirectories));
          Dictionary<string, int> Messagetype = new Dictionary<string, int>();
          foreach (var item in files)
          {

              try
              {
                  // Dictionary<string, int> Messagetype = new Dictionary<string, int>();
              //var zipFileName = item;
              //var targetDir = Path.Combine(path, "unpack");
              //FastZip fastZip = new FastZip();
              //string fileFilter = null;
              //fastZip.ExtractZip(item, targetDir, fileFilter);


                  Console.WriteLine(counter++);

              Console.WriteLine("Unzipping " + counter + item.Substring(52));




              using (var zipInputStream = new ZipInputStream(File.OpenRead(item)))
              {
                  using (var fileStream = new FileStream(item, FileMode.Open, FileAccess.Read))
                  {
                      var zipFile = new ZipFile(fileStream);
                      ZipEntry zipEntry;

                      while ((zipEntry = zipInputStream.GetNextEntry()) != null)
                      {
                          var textStream = zipFile.GetInputStream(zipEntry);
                          using (var textLine = new StreamReader(textStream))
                          {
                              string message;
                              while ((message = textLine.ReadLine()) != null)
                              {
                                  if (string.IsNullOrEmpty(message)) continue;
                                  string[] parts = message.Split(new[] { "|" }, StringSplitOptions.None);
                                  if (!Messagetype.ContainsKey(parts[1]))
                                      Messagetype[parts[1]] = 0;
                                  Messagetype[parts[1]]++;
                              }
                          }
                      }
                  }
              }
              }
              catch (Exception ex1)
              {
                   Console.WriteLine( "File Name - " + item + " Error -" + ex1.Message);
                  //throw;
              }



          }
          foreach (var ms in Messagetype.Keys)
          {
              Console.WriteLine(ms + "-" + Messagetype[ms]);
          }


Что я уже пробовал:

Можете добавить его в DataTable

1 Ответов

Рейтинг:
1

Maciej Los

Для этого нет встроенного метода, но вы можете написать собственный " вспомогательный класс":

void Main()
{
	Dictionary<string, int> Messagetype = new Dictionary<string, int>();
	
	Messagetype.Add("a", 1);
	Messagetype.Add("b", 1);
	Messagetype.Add("c", 2);
	Messagetype.Add("d", 2);
	Messagetype.Add("e", 3);
	
	DataTable dt = HelperClass.ToDataTable(Messagetype);
	
	//dt contains Dictionary data
}

// Define other methods and classes here
public static class HelperClass
{

	public static DataTable ToDataTable(Dictionary<string, int> d)
	{
		DataTable dt = new DataTable();
		dt.Columns.Add("Item1", typeof(string));
		dt.Columns.Add("Item2", typeof(int));
		
		var result = d.Select(x=> dt.LoadDataRow(new object[] {x.Key, x.Value}, false));
		
		dt = result.CopyToDataTable();
		
		return dt;
	}
	
}


Для получения более подробной информации, пожалуйста, смотрите:
объект DataTable.Метод LoadDataRow (Object [], Boolean) (System. Data)[^]
Создание DataTable из запроса (LINQ to DataSet)[^]

[РЕДАКТИРОВАТЬ]
Бруно, Спасибо за ценный комментарий!
[/РЕДАКТИРОВАТЬ]


0x01AA

А 5 но:
a.) DataTable dt = новый DataTable();
dt = HelperClass.ToDataTable(Messagetype);
..... должно быть больше ...
DataTable dt = HelperClass.ToDataTable(Messagetype);
б) Что произойдет, если вы вызовете ToDataTable(...) более одного раза?

Maciej Los

- Спасибо, Бруно.
Что касается б): хороший улов! Проверьте обновленное решение ;)