2017-02-06 3 views
1

Я кодирование метод API, который возвращает JSON в следующем формате:Состояния, если список существует в списке

{ 
    "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" 
      } 
     ] 
     } 
    ] 
} 

Я сформировать этот JSON из данных, где я получаю комбинацию из Rooms: Каждые 2 номеров вместе имею только 1 вариант.

Я хочу проверить, есть ли комбинация комнат (имя/взрослый/дети), я хочу только добавить option к существующим Options.

Класс:

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

Так что я хочу сделать, это: петля через Results, и внутри каждого Result я хочу, чтобы проверить, если RoomList уже доступен в другом Result: Если это доступно, я добавляю Option в список: Options. Если он новый, я добавляю новый элемент в Results.

Я попытался сделать это:

//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); 

          } 

Мне нужно заменить условие Results.Exists(e => e.RoomList == roomList) с чем-то еще.

Может кто-нибудь помочь

+0

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

+0

@Dispersia Мне жаль, что я имел в виду, прежде чем я сформирую этот JSON, я получаю XML, где у каждого 2 номера есть 1 вариант. Мне нужно сделать алгоритм, который формирует JSON выше, где, если эти 2 комнаты уже существуют, я не добавляю их снова, я просто добавляю 1 вариант для них. – HelpASisterOut

ответ

1

Предполагая, что результаты является IEnumerable Результата

Вариант № 1

Сначала вы хотите переопределить равно на объекте номер как так

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; 
    } 
} 

Тогда в вашем коде вы можете очень изящно поставленный

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

, а также отрегулируйте «результат = Результаты. Где (e => e.RoomList == roomList).FirstOrDefault()»в

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

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

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; 
     } 
    } 

Вариант 2

Если вы либо не хотят, либо не могут переопределить равные, то вы можете сделать такой метод

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

Тогда два утверждения становятся

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 Вы можете использовать FirstOrDefault вместо а где

+0

Я пошел на вариант № 2, работал как магия. Благодарю. – HelpASisterOut

0

Как я понимаю, вы должны проверить, если номер уже в результатах.

Итак, вы должны проехать по комнатеList и для каждого элемента проверить, если Results.Rooms.Contains (room).

Переопределить метод Equals, если требуется .. https://msdn.microsoft.com/en-us/library/bhkz42b3(v=vs.110).aspx

Надеется, что это помогает!

+0

Я хочу проверить, есть ли комбинация * комнаты * уже в номереLists, а не только одна комната – HelpASisterOut

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