2016-04-14 14 views
0

Ich laufe aus Ideen, wie ein Array (Anfrage Array A [], um Antwort Array B [])Wie dekomprimiere ich ein Array in C#?

hier zu dekomprimieren sind meine Definitionen

A ist eine Anfrage-Klasse.

class A 
{ 
    public string Date { get; set; } 
    public decimal Price { get; set; } 
} 

Unten ist meine Reihe von Anfragen der Klasse A mit seiner Initialisierung.

var request = new A[] 
    { 
     new A { Date = "14-04-2016", Price = 100 }, 
     new A { Date = "15-04-2016", Price = 100 }, 
     new A { Date = "16-04-2016", Price = 0 }, 
     new A { Date = "17-04-2016", Price = 100 }, 
     new A { Date = "18-04-2016", Price = 100 } 
    }; 

B ist eine respond Klasse.

class B 
{ 
    public string Start { get; set; } 
    public string End { get; set; } 
    public decimal Price { get; set; } 
} 

Die obigen Anträge muss auf ein Array von B umgewandelt werden. So etwas wie dieses

var response = new B[] 
    { 
     new B { Start = "14-04-2016", End = "16-04-2016", Price = 100 }, 
     new B { Start = "16-04-2016", End = "17-04-2016", Price = 0 }, 
     new B { Start = "17-04-2016", End = "18-04-2016", Price = 100 } 
    }; 

Die Antwort wird basierend auf dem Preis und Reihenfolge nach Datum gruppiert. Es ist mehr wie, ich muss das Anfrage-Array A [] in Antwort-Array B [] dekomprimieren.

Wie kann ich das erreichen?

Antwort

1

Sie könnten dies mit GroupBy linq Erweiterung, folgende Abfrage List<B> Objekte zurückgeben.

var results = request.Select(s=> 
      new 
      { 
       Price = s.Price, 
       Date = DateTime.ParseExact(s.Date, "dd-MM-yyyy", null) // convert to Date. 
      }) 
    .GroupBy(g=>g.Price) 
    .Select(s=> 
      new B() 
      { 
       Start = s.Min(c=>c.Date).ToString("dd-MM-yyyy"), 
       End = s.Max(c=>c.Date).ToString("dd-MM-yyyy"), 
       Price = s.Key 
      }) 
    .ToList() ; 

Update:

Wie pro Kommentare, Sie benötigen auf den Preis nicht wirklich zu gruppieren. Was Sie brauchen, ist Gruppierung neben Artikel, deren Preis übereinstimmt.

Wir könnten dies mit geringfügigen Änderung oben Linq Abfrage erreichen.

int grp = 0; 
    decimal prevprice=response.First().Price; 
    var results = request.Select((s, i)=> 
        { 

         grp = s.Price == prevprice? grp : ++grp;      
         prevprice = s.Price; 
         return new 
         { 
          grp, 
          Price = s.Price, 
          Date = DateTime.ParseExact(s.Date, "dd-MM-yyyy", null) 
         }; 
        }) 
      .GroupBy(g=>g.grp) 
      .Select(s=> 
        new B() 
        { 
         Start = s.Min(c=>c.Date).ToString("dd-MM-yyyy"), 
         End = s.Max(c=>c.Date).ToString("dd-MM-yyyy"), 
         Price = s.First().Price 
        }); 

Ausgabe

14-04-2016,15-04-2016 ,100 
16-04-2016,16-04-2016 ,0 
17-04-2016,18-04-2016 ,100 

Arbeiten Example

+0

Vielen Dank für Ihre Antwort. Aber Ihre Implementierung bringt mich so "14-04-2016,18-04-2016,100", "16-04-2016,16-04-2016,0", was nicht meine bevorzugte Ausgabe ist. – Karthik

+0

Was ist Ihre bevorzugte Ausgabe? Bei der Frage ging es darum, den Typ "A" in den Typ "B" zu konvertieren. Fehle ich etwas? –

+0

Die bevorzugte Ausgabe ist diejenige, die ich im Antwortfeld gezeigt hatte, das in den Fragedetails steht. – Karthik

1

Pseudocode (annimmt Anfrage wird nach Datum sortiert - wenn Sie es nicht leicht sortieren):

int lastPrice = -1; 

//count the distinct price ranges 
int responseSize = 0; 
foreach (A requestObj in request) { 
if (requestObj.price != lastPrice) { 
    responseSize++; 
    lastPrice = requestObj.price; 
} 
} 


//set the initial element 
B[] response = new B[responseSize]; 
response[0].start = request[0].date; 
response[0].price = request[0].price; 
int responseindex = 0; 

//parse the result 
foreach (A requestObj in request) { 
if (requestObj.price != response[responseindex].price) { 
    response[responseindex].end = requestObj.date; 
    responseIndex++; 
    response[responseindex].price = requestObj.price; 
    response[responseindex].start= requestObj.date; 
} 
} 

//set the end date of the final object 
response[response.length - 1].end = request[request.length - 1].date; 
0

Dies kann auch mit folgendem geschehen:

var response = from reqItem in request 
group reqItem by reqItem.Price into g 
select new B() 
{ 
    Start = g.Min(m => DateTime.Parse(m.Date)).ToString("dd-MM-yyyy"), 
    End = g.Max(m => DateTime.Parse(m.Date)).ToString("dd-MM-yyyy"), 
    Price = g.Key 
}; 
Verwandte Themen