2017-08-05 6 views
0

Je lis un certain nombre de fichiers txt. Je lis chaque ligne, divisant et créant un objet en ajoutant finalement à la collection.Comment extraire un élément de la collection en fonction d'un autre élément?

EXEMPLE DE CONTENU DU FICHIER:

Record1, Temps, Celsius (° C), Alarme haute, Alarme basse, humidité (% rh), point de rosée (° C), numéro de série
1, 02/06/2017 09: 26: 30,19,5,32,0,7,0,64,0,12,5,11211222
2,02/06/2017 09: 31: 30,21,0,32,0,7.0,54,5,11,4
3, 06/02/2017 09: 36: 30,20.5,32.0,7.0,54.5,11.0

List<MagModel> Records = new List<MagModel>(); 

using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Text 
File|*.txt", Multiselect = true }) 
{ 
    ofd.InitialDirectory = HelperClass.GetDirectory; 

    if (ofd.ShowDialog() == DialogResult.OK) 
    { 
     foreach (string file in ofd.FileNames) 
     { 
      using (StreamReader reader = new StreamReader(file)) 
      { 
       reader.ReadLine(); 
       if (file.Contains("Record1")) 
       { 
        var lines = from line in reader.Lines() 
           where !string.IsNullOrEmpty(line) 
           select line; 

        foreach (var line in lines) 
        { 
         var result = line.Split(','); 

         MagModel model1 = new MagModel(); 

         model1.magazine = "Record1";         
         model1.date = result[1]; 
         model1.temp = Convert.ToDouble(result[2]); 
         model1.humidity = Convert.ToDouble(result[5]); 
         Records.Add(model1); 

        } 

        MaxMinTemperature.maxTemp = Records.Max(r => r.temp); 
        MaxMinTemperature.minTemp = Records.Min(r => r.temp); 
       } 
      } 
     } 
    } 
} 

Alors je m `trouver les températures maximales et minimales dans la collection (21,0 et 19,5 dans l'exemple):

MaxMinTemperature.maxTemp = Records.Max(r => r.temp); 
MaxMinTemperature.minTemp = Records.Min(r => r.temp); 

Comment puis-je trouver la date à laquelle la plus haute et/ou température la plus basse a été collecté?

Merci,

+2

Veuillez faire n otage de contenu de mixage et analyse de données –

+0

Copies possibles: [ici] (https://stackoverflow.com/questions/914109/how-to-use-linq-to-select-object-with-minimum-or-maximum-property -value), [ici] (https://stackoverflow.com/questions/1101841/linq-how-to-perform-max-on-a-property-of-all-objects-in-a-collection-and- ret). Essentiellement, vous devez récupérer l'objet associé à la valeur max/min et utiliser les propriétés selon vos besoins. – crazyGamer

Répondre

0

Définir votre modèle comme celui-ci:

public class MagModel 
{ 
    public int Record1 { get; set; } 
    public DateTime Time { get; set; } 
    public double Celsius { get; set; } 
    public double HighAlarm { get; set; } 
    public double LowAlarm { get; set; } 
    public double Humidity { get; set; } 
    public double DewPoint { get; set; } 
    public string SerialNumber { get; set; } 
} 

puis écrire la méthode d'analyse séparée:

public static IEnumerable<MagModel> ParseFile(string filename) 
{ 
    // put your parsing here 
} 

maintenant, il sera facile d'obtenir des dates de températures max et min :

var input = ParseFile("input.csv"); 
var orderByCelsius = input.OrderBy(m => m.Celsius).ToArray(); 
var minTemperatureDate = orderByCelsius.FirstOrDefault()?.Time; 
var maxTemperatureDate = orderByCelsius.LastOrDefault()?.Time; 
+0

Aleks comment puis-je analyser le fichier? – Thomas

+0

@Thomas alors quel est votre problème? Vous ne pouvez pas analyser un fichier ou vous ne pouvez pas trouver les dates de température max et min? –

+0

Je n'étais pas sûr de savoir comment utiliser la méthode d'analyse de type IEnumerable. – Thomas