2016-07-20 4 views
0

У меня есть набор различных массивов, которые необходимо сгруппировать и отсортировать. Тем не менее, я не уверен, как я собираюсь объединить массивы, чтобы их можно было отсортировать. Я пытаюсь сделать так, чтобы пользователь мог выбрать, какой массив в наборе сгруппированных массивов станет базой сортировки.Группировка массивов вместе и сортировка Несколько массивов вокруг выбранного массива

Под этим я подразумеваю, что если бы я сгруппировал все массивы под названием WS1 вместе с Месяцем и Годом (это означает Год, Месяц, afArray, rainArray, sunArray, tMaxArray, tMinArray) Я бы хотел, чтобы я мог нацелиться на определенный массив как tmaxArray и сортировать все массивы, чтобы соответствовать этому массиву.

данных в массивах будет выглядеть вроде как:

 
Month  | February March April May  ... 

Year  | 1997  1997 1997 1997 

afArray | 2  0  4  1 

rainArray | 132.00 102.00 112.00 134.00

Я хотел бы, чтобы все эти массивы могут быть отсортированы в соответствии с этим из (например, rainArray), что приводит к выходу:

Month  | March April February May  ... 

Year  | 1997 1997 1997  1997 

afArray | 0  4  2   1 

rainArray | 102.00 112.00 132.00 134.00

Может ли кто-нибудь дать мне какие-либо советы о том, как я могу это сделать, если это можно сделать? И возможно ли иметь возможность сортировать их по фактическому алгоритму, а не через Visual Studios, встроенные в приложение для сортировки?

Просто чтобы дать некоторую форму дополнительного объяснения того, как система в настоящее время построена это текущий код:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 



namespace Climate_Sorting_Application 
{ 
    public class Program 
    { 
     public static string cont = "Y"; 
     public static string station; 
     public static string[] monthArray = File.ReadAllLines("Month.txt"); 
     public static string[] yearArrayPre = File.ReadAllLines("Year.txt"); 
     public static int[] afArray = File.ReadAllLines("WS1_AF.txt").Select(int.Parse).ToArray(); 
     public static string[] rainArray = File.ReadAllLines("WS1_Rain.txt"); 
     public static string[] sunArray = File.ReadAllLines("WS1_Sun.txt"); 
     public static string[] tmaxArray = File.ReadAllLines("WS1_TMax.txt"); 
     public static string[] tminArray = File.ReadAllLines("WS1_TMin.txt"); 
     public static string[] af2Array = File.ReadAllLines("WS2_Rain.txt"); 
     public static string[] rain2Array = File.ReadAllLines("WS2_Rain.txt"); 
     public static string[] sun2Array = File.ReadAllLines("WS2_Sun.txt"); 
     public static string[] tmax2Array = File.ReadAllLines("WS2_TMax.txt"); 
     public static string[] tmin2Array = File.ReadAllLines("WS2_TMin.txt"); 
     public static string arrayToAnalyse; 
     public static int t; 

     static void Main(string[] args) 
     { 
      while(cont == "Y") 
      { 
       Console.WriteLine("Please State which Station you wish to view data for"); 
       Console.WriteLine("Please type either 1 or 2 now then hit enter"); 

       station = Console.ReadLine(); 

       if(station == "1") 
       { 

       } 

       if (station == "2") 
       { 

       } 

       else 
       { 
        Console.WriteLine("Not a valid input. Restarting process"); 
        Console.WriteLine("---------------------------------------"); 
       } 
      } 

      Console.WriteLine("Thank you for using the Data Sorting System"); 
      Console.WriteLine("Hit Enter to Close Program"); 
      Console.ReadLine(); 


     } 

     private static void sortProcess() 
     { 

     } 
    } 
} 
+0

Я не знаю «Не понимаю, что означает« база рода » – konkked

+0

Да, я понимаю, что это не имело большого смысла. Я добавил дополнительную информацию, чтобы попытаться разобраться с тем, что я имею в виду. – GiggyLapisar

+1

Сгруппированные массивы - это анти-шаблон. Это знак, который вы должны создать класс со свойством для каждого из массивов, которые вы используете в настоящее время, и затем иметь один массив нового типа класса. –

ответ

0

Сгруппированных массивы являются анти-моделью. Это знак, который вы должны создать класс со свойством для каждого из массивов, которые вы используете в настоящее время, и затем иметь один массив нового типа класса. Сделайте это, и сортировка ваших данных станет простым выражением .OrderBy().

Я написал для вас код ниже, но все это набрано непосредственно в окне ответа, и даже если бы оно не было, у меня нет тестовых данных. Но это должно дать вам представление о том, для чего вы собираетесь ... немного больше кода для загрузки данных, но обратите внимание, как мало кода вам нужно манипулировать им, когда мы его готовы:

namespace Climate_Sorting_Application 
{ 

    public class ClimateRecord 
    { 
     public DateTime RecordDate {get;set;} 
     public int StationId {get;set;} 
     public double RainFall {get;set;} 
     public double Sun {get;set;} 
     public double TMax {get;set;} 
     public double TMin {get;set;} 
     public double AF {get;set;} 

     public override string ToString() 
     { 
      return String.Format("{0,-15:MMMM yyyy}{1,4}{2,8:F4}{3,8:F4}{4,8:F4}{5,8:F4}{6,8:F4}{7,8:F4}", 
       RecordDate, StationId, AF, RainFail, Sun, TMax, TMin); 
     } 
    } 

    public class Program 
    { 

     static IList<ClimateRecord> LoadData() 
     { 
      var result = new List<ClimateRecord>(); 

      using (var monthRdr = new StreamReader("Month.txt")) 
      using (var yearRdr = new StreamReader("Year.txt")) 
      using (var afRdr1 = new StreamReader("WS1_AF.txt")) 
      using (var rainRdr1 = new StreamReader("WS1_Rain.txt")) 
      using (var sunRdr1 = new StreamReader("WS1_Sun.txt")) 
      using (var tmaxRdr1 = new StreamReader("WS1_TMax.txt")) 
      using (var tminRdr1 = new StreamReader("WS1_TMin.txt")) 
      using (var afRdr2 = new StreamReader("WS2_AF.txt")) 
      using (var rainRdr2 = new StreamReader("WS2_Rain.txt")) 
      using (var sunRdr2 = new StreamReader("WS2_Sun.txt")) 
      using (var tmaxRdr2 = new StreamReader("WS2_TMax.txt")) 
      using (var tminRdr2 = new StreamReader("WS2_TMin.txt")) 
      { 
       string year = yearRdr.ReadLine(); 
       while (year != null) 
       { 
         var recordDate = DateTime.ParseExact(year + " " + monthRdr.ReadLine() + " 01", "yyyy MMMM dd", null) 

         var ws1 = new ClimateRecord() { 
          RecordDate = recordDate, 
          StationId = 1, 
          AF = double.Parse(afRdr1.ReadLine()), 
          Sun = double.Parse(sunRdr1.ReadLine()), 
          RainFall = double.Parse(rainRdr1.ReadLine()), 
          TMax = double.Parse(tmaxRdr1.ReadLine()), 
          TMin = double.Parse(tminRdr1.ReadLine()) 
         }; 
         var ws2 = new ClimateRecord() { 
          RecordDate = recordDate, 
          StationId = 2, 
          AF = double.Parse(afRdr2.ReadLine()), 
          Sun = double.Parse(sunRdr2.ReadLine()), 
          RainFall = double.Parse(rainRdr2.ReadLine()), 
          TMax = double.Parse(tmaxRdr2.ReadLine()), 
          TMin = double.Parse(tminRdr2.ReadLine()) 
         }; 
         result.Add(ws1); 
         result.Add(ws2); 
         year = yearRdr.ReadLine(); 
       } 
      } 
      return result; 
     } 

     static void PrintData(IEnumerable<ClimateRecord> data) 
     { 
      Console.WriteLine("{0,15}{1,4}{2,8}{3,8}{4,8}{5,8}{6,8}{7,8}", 
       "Month/Year", "WS", "AF", "Rain", "Sun", "T-Max", "T-Min"); 

      foreach (var record in data) Console.WriteLine(record); 
     } 


     static void Main(string[] args) 
     { 
      var climateData = LoadData(); 

      Console.WriteLine("Printing all data: "); 
      PrintData(climateData); 

      Console.WriteLine("\n\nPrinting Station 1 data:"); 
      PrintData(climateData.Where(r => r.StationId == 1)); 

      Console.WriteLine("\n\nPrinting Station 2 data:"); 
      PrintData(climateData.Where(r => r.StationId == 2)); 

      Console.WriteLine("\n\nPrinting Station 1 data ordered by rainfall descending:"); 
      PrintData(climateData.Where(r => r.StationId == 1).OrderBy(r => r.RainFall * -1)); 
     } 
    } 
} 
+0

вместо 'string item = yearRdr.ReadLine(); while (item! = null) 'Я бы рекомендовал использовать' while (! yearRdr.EndOfStream) '. Чтобы сделать его еще более надежным, если есть несоответствие количества записей, лучше проверить все читатели EndOfStream. – kurakura88

+0

В настоящее время единственная ошибка, которую я вижу с кодом, - это когда я помещаю ее в Visual Studio. Я получаю сообщение об ошибке с записью. области (название «запись» не существует в текущем контексте). Также в этой форме данные могут быть отсортированы любым способом с использованием фактического письменного кода, поскольку я пытаюсь избежать использования встроенного метода сортировки по Visual Studio по умолчанию. – GiggyLapisar

+0

Я думаю, что я исправил проблему «record.». Для сортировки см. Мой основной метод для примеров, но вы также можете сделать это вручную, если вам действительно нужно. –

Смежные вопросы