2016-06-24 12 views
0

Ich habe eine Klasse wie unten gezeigt, in dieser Klasse gibt es Eins-zu-Eins-Zuordnung zwischen Amount-Array und Array-Daten-Indizes, so dass Länge immer gleich sein wird.Linq kombinieren Arrays von der gleichen Objektinstanz

Ich habe die maximale Menge von Betrag [], wo Date1> DateTime.Today & DateTime.Today < Date2 < @OneParameterDate zu bekommen.

Wie kann dies mit Linq getan werden?

public class TestClass 
    { 
     public string ID { get; set; } 

     public decimal[] Amount { get; set; } 

     public DateTime[] Date1 { get; set; } 

     public DateTime[] Date2 { get; set; } 

     public DateTime[] Date3 { get; set; } 

     public string Name { get; set; } 

    } 
+4

Sicherlich würden Sie besser dran Sammlung von Objekten mit 4 bezogenen Eigenschaften als 4 Sammlungen von Werten, die nicht miteinander verwandt sind offensichtlich? Abgesehen davon, dass es einfacher zu lesen ist, würde es Ihr Problem trivial lösen. –

+0

@CharlesMager Ich wollte diesen gleichen Moment schreiben: D –

+0

Ansonsten denke ich, dass Sie eine 'for' Schleife brauchen, die einen gemeinsamen Index zwischen' Amount', 'Date1' und' Date2' enthält. –

Antwort

2

Der Kommentar von Charles Mager zeigt in die richtige Richtung. Aber wenn Sie nicht bereit sind, Ihren Code auf diese Weise zu ändern, dies sollten Sie das gewünschte Ergebnis:

decimal maxAmount = Enumerable.Range(0, Amount.Length) 
    .Where(i => Date1[i] > DateTime.Today && 
       Date2[i] > DateTime.Today && 
       Date2[i] < OneParameterDate) 
    .Max(i => Amount[i]); 

Enumerable.Range iteriert durch den Array-Indizes, Where Filter für die Indizes, wo Ihr Zustand (wie ich verstand es ist von deiner Frage) erfüllt.

Von diesen gefilterten Indizes wählt Max den maximalen Betragswert aus.

+0

sehr coole Antwort! –

+0

Habe nicht mal darüber nachgedacht! Nice –

2

Wenn Sie können, eine bessere Darstellung eine Klasse wie folgt zu haben sein:

public class ClassA 
{ 
    public decimal Amount { get; set; } 
    public DateTime Date1 { get; set; } 
    public DateTime Date2 { get; set; } 
    public DateTime Date3 { get; set; } 
} 

Und dann haben Sie eine IEnumerable<ClassA> in Ihrem TestClass. Jetzt können Sie linq-Abfragen darauf ausführen.

records.Where(record.Date1 < DateTime.Today && 
       DateTime.Today < record.Date2 && 
       record.Date2 < @SomeParameter) 
     .Max(record.Amount); 
+0

Also muss ich eine weitere Klasse erstellen, die IEnumerable und ID und Name umschließt. – Deepak

+0

Sie können auch tun: öffentliche Klasse TestClass { öffentliche String-ID {bekommen; einstellen; } public decimal Betrag {get; einstellen; } public DateTime Date1 {get; einstellen; } public DateTime Date2 {get; einstellen; } public DateTime Date3 {get; einstellen; } public string Name {get; einstellen; } } Und haben Sie eine Sammlung der TestClass - aber Sie sehen besser für Ihr Modell. –

+0

Formatierung ist schlecht, aber im Grunde nur die Arrays aus Ihrem ursprünglichen Objekt entfernt und haben eine Sammlung davon. Die Idee ist, dass es keine schöne Möglichkeit ist, es in 4 verschiedenen Arrays darzustellen und sicherzustellen, dass sie synchronisiert werden. –