C # прямоугольный массив сортировки - PullRequest
3 голосов
/ 27 ноября 2010
string[,] desc = new string[255,10];    
int descLines = 0;
cont string RDATAPATCH = "rctdata.xdb";
using (StreamReader sr = new StreamReader(RDATAPATCH))
{
      descLines = 0;
      while (sr.Peek() > -1)
      {
         sr.ReadLine();
         descLines++;
      }
      desc = new string[descLines, 10];
      int line = 0;
      sr.BaseStream.Position = 0;
      sr.DiscardBufferedData();
      while (sr.Peek() > -1)
      {
         string ltxt = sr.ReadLine();
         string[] lstxt = ltxt.Split('|');
         for (int x = 0; x < 10; x++)
         {
            desc[line, x] = lstxt[x];
         }
         line++;
      }
}
string[] sArray = new string[descLines];
for (int x = 0; x < descLines; x++)
{
   sArray[x] = desc[x, 7];
}
Array.Sort(sArray);
string[,] tempDesc = new string[descLines, 10];
for (int x = 0; x < sArray.Length; x++)
{
   for (int y = 0; y < desc.Length / 10; y++)
   {
      if (sArray[x] == desc[y, 7])
      {
         for (int z = 0; z < 10; z++)
         {
            tempDesc[x, z] = desc[y, z];
         }
      }
   }
}
desc = tempDesc;

У меня есть этот код и файл, который загружает потоковая программа, выглядит так:

id|rid|type|date opened|code|<0/1>|<number>|open date|availability('in stoc' or '11.11.2010'>|<0/1/2>
0|0|15fl*20ml/cut|04.2012|200905.101109|1|1|nedeschis|in stoc|2
1|0|15fl*20ml/cut|07.2012|200905.030210|1|1|nedeschis|in stoc|2
2|10|150 teste/cut|11.2012|16813A|1|3|nedeschis|in stoc|2
3|0|15fl*20ml/cut|06.2011|200905.050309|0|11|07.07.2010|in stoc|0

переменная desc сортируется по строке открытой даты и может быть: 'nedeschis' (закрыто) или '11 .11.2010 '(дата). Я думаю, что мой алгоритм неверен, кто-нибудь может мне помочь?

Ответы [ 2 ]

1 голос
/ 27 ноября 2010

Алгоритм кажется в основном правильным, однако, поскольку значения отсортированы в виде строк, результат не будет в хронологическом порядке.Например, строковое значение «07.07.2010» больше, чем «06.08.2010».Вам потребуется преобразовать значения в значения DateTime, чтобы правильно их сравнивать.

Кроме того, поскольку вы используете значение даты для идентификации элементов после сортировки, а значения не являются уникальными, вы получитес дубликатами некоторых предметов и потерять другие предметы.По-прежнему будет возможно выполнить сортировку таким образом, но тогда вам придется удалить повторяющиеся значения после сортировки и изменить цикл, который соответствует значениям, для обработки повторяющихся совпадений.строковые массивы вместо двухмерных массивов, что сделало бы код намного проще.Вы можете прочитать данные за один проход, и вы можете отсортировать элементы в списке вместо сортировки определенного значения, а затем сопоставить элементы:

List<string[]> desc = new List<string[]>();
const string RDATAPATCH = "rctdata.xdb";
using (StreamReader sr = new StreamReader(RDATAPATCH)) {
  string line;
  while ((line = sr.ReadLine()) != null) {
    desc.Add(line.Split('|'));
  }
}
desc.RemoveAt(0); // remove field description line
desc.Sort((a, b) => {
  if (a[7] == "nedeschis" && b[7] == "nedeschis") return 0;
  if (a[7] == "nedeschis") return -1;
  if (b[7] == "nedeschis") return 1;
  return DateTime.Parse(a[7]).CompareTo(DateTime.Parse(b[7]));
});
1 голос
/ 27 ноября 2010

Я не могу сказать из вопроса, в чем проблема, но рассмотрите возможность переключения на List<string[]> вместо string[,]. Вам не придется читать файл дважды; сортировка вашего списка будет проще; и ваша проблема с алгоритмом может уйти.

В .NET с многомерными массивами, такими как string[,], довольно трудно работать, поскольку большинство методов работают только с одномерными массивами. Вы можете смоделировать двумерный массив с помощью зубчатого массива (a string[][]). Тем не менее, в вашем случае List<string[]> будет лучшим выбором, так как вы не знаете размер заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...