2017-02-06 3 views
1

Ich entwickle eine API-Methode, die JSON in folgendem Format zurück:Zustand, wenn Liste existiert innerhalb Liste

{ 
    "Results":[ 
     { 
     "Rooms":[ 
      { 
       "Name":"Deluxe Room", 
       "Adults":2, 
       "Children":0 
      }, 
      { 
       "Name":"Single Room", 
       "Adults":1, 
       "Children":0 
      } 
     ], 
     "Options":[ 
      { 
       "Name":"Room Only", 
       "Price":"100" 
      }, 
      { 
       "Name":"Breakfast", 
       "Price":"200" 
      } 
     ] 
     } 
    ] 
} 

Ich bilde dieses JSON von Daten, wo ich Kombinationen von Rooms erhalten: Jeweils 2 Zimmer haben zusammen nur 1 Möglichkeit.

Ich möchte überprüfen, ob die Kombination der Räume (Name/Erwachsener/Kinder) bereits verfügbar ist, ich möchte nur die option zu den bestehenden Options hinzufügen.

Klasse:

public class Results 
{ 
    public List<RoomList> Rooms { get; set; } 
    public List<Option> Options { get; set; } 
} 

Also, was ich tun möchte, ist: Schleife durch Results, und in jedem Result Ich möchte überprüfen, ob die RoomList in einem anderen Result bereits vorhanden ist: Wenn es verfügbar ist, ich hinzufügen die Option Liste: Options. Wenn es neu ist, füge ich einen neuen Artikel zu Results hinzu.

Ich habe versucht, dies zu tun:

//Fill roomOption 

//Fill roomList 

          Results Results= new Results(); 
          if (!Results.Exists(e => e.RoomList == roomList)) 
          { 
           Results result = new Results() 
           { 
            RoomList = roomList 
           }; 
           //add the option 
           if (result.Options == null) 
            result.Options = new List<Option>(); 
           result.Options.Add(roomOption); 
           results.Add(result); 
          } 
          else 
          { 
           result= Results.Where(e => e.RoomList == roomList).FirstOrDefault(); 
           //Add the option to the already existing room list 
           if (result.Options == null) 
            result.Options = new List<Option>(); 
           result.Options.Add(roomOption); 

          } 

Ich brauche sonst die Bedingung Results.Exists(e => e.RoomList == roomList) mit etwas zu ersetzen.

Kann mir jemand helfen

+0

Versuch zu verstehen, was Sie setzen, sagten Sie jeweils zwei Zimmer zusammen nur eine Option, aber dann eine Liste haben von zwei Optionen für die zwei Räume. Könnten Sie diesen Teil klären? – Dispersia

+0

@Dispersia Es tut mir leid, was ich meinte, bevor ich dieses JSON formiere, erhalte ich ein XML, wo jedes 2 Zimmer 1 Option hat. Ich muss den Algorithmus tun, der den JSON oben bildet, wo, wenn diese 2 Räume bereits bestehen, ich sie nicht wieder addiere, addiere ich gerade 1 Option zu ihnen – HelpASisterOut

Antwort

1

Ergebnisse Unter der Annahme ist eine IEnumerable von Ergebnis

Option # 1

Zuerst wie so auf dem Raum-Objekt überschreiben wollen gleich

public override bool Equals(object obj) 
{ 
    var other = (Room) obj; 
    return string.Equals(Name, other.Name) 
     && Adults == other.Adults 
     && Children == other.Children; 
} 

public override int GetHashCode() 
{ 
    unchecked 
    { 
     var hashCode = Name.GetHashCode(); 
     hashCode = (hashCode * 397)^Adults; 
     hashCode = (hashCode * 397)^Children; 
     return hashCode; 
    } 
} 

Dann in Ihrem Code können Sie sehr elegant gesetzt

if (!Results.Any(e => e.Rooms.Count() == roomList.Count() 
    && e.Rooms.All(x => roomList.Contains(x)))) 

und passen Sie auch "result = Results.Where (e => e.RoomList == roomList) an.FirstOrDefault()“zu

result = Results.FirstOrDefault(e => e.Rooms.Count() == roomList.Count() 
    && e.Rooms.All(x => roomList.Contains(x))); 

Randnotiz, wenn Sie NULL-Werte betroffen sind oder Zimmer zu vergleichen mit anderer Art von Objekten verwendet, dies entspricht Methode anstelle

public override bool Equals(object obj) 
{ 
    if (ReferenceEquals(null, obj)) return false; 
    if (ReferenceEquals(this, obj)) return true; 
    if (obj.GetType() != this.GetType()) return false; 
    return Equals((Room) obj); 
} 

protected bool Equals(Room other) 
{ 
    return string.Equals(Name, other.Name) && Adults == other.Adults && Children == other.Children; 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      var hashCode = Name.GetHashCode(); 
      hashCode = (hashCode * 397)^Adults; 
      hashCode = (hashCode * 397)^Children; 
      return hashCode; 
     } 
    } 

Option 2

Wenn Sie Entweder wollen oder können nicht überschreiben gleich dann können Sie eine Methode wie folgt machen

private bool DoesRoomMatch(Room rm1, Room rm2) 
{ 
    return string.Equals(rm1.Name, rm2.Name) 
     && rm1.Adults == rm2.Adults 
     && rm1.Children == rm2.Children; 
} 

Dann werden die beiden Aussagen werden

if (!Results.Any(e => e.Rooms.Count() == roomList.Count() 
    && e.Rooms.All(x => roomList.Any(y => DoesRoomMatch(x, y))))) 

result = Results.FirstOrDefault(e => e.Rooms.Count() == roomList.Count() 
    && e.Rooms.All(x => roomList.Any(y => DoesRoomMatch(x, y)))); 

BTW Sie FirstOrDefault anstelle eines verwenden Wo

+0

Ich ging für Option # 2, arbeitete wie Magie. Vielen Dank. – HelpASisterOut

0

Wie ich verstehe, müssen Sie überprüfen, ob ein Zimmer bereits in den Ergebnissen ist.

Sie sollten also die Raumliste durchlaufen und für jedes Element überprüfen, ob Results.Rooms.Contains (Raum).

die Equals-Methode außer Kraft setzen, wenn benötigt wird .. https://msdn.microsoft.com/en-us/library/bhkz42b3(v=vs.110).aspx

Hoffe, es hilft!

+0

Ich möchte prüfen, ob die Raum * Kombination * bereits in den roomLists, nicht verfügbar ist nur ein Zimmer – HelpASisterOut

Verwandte Themen