2015-01-04 2 views
0

Если элемент содержит определенный элемент с флагом, получите его и добавьте в коллекцию. В моем коде это означает, что получить все песни, где genreid == 18 // например, номер может быть любым int32 //. Я буду рад видеть ответы. Я использовал linq для его получения, но вижу только то, что число int32 и ничего больше. это мой код: (список песни List)Получить все конкретные элементы с флагом

var json = e.Result; 
       var jobject = JObject.Parse(json); 
       var serializer = new JsonSerializer(); 
       serializer.Converters.Add(new ResponseDataConverter()); 
       var songList = jobject["response"].ToObject<SongList>(serializer); 
       song.GenreId = (int)from other in songList.Songs where other.GenreId == 18 select other.GenreId; 

если это поможет вам это мой класс десериализации: (с перекрытыми методами)

public abstract class ResponseData 
    { 
     [JsonProperty(PropertyName = "id")] 
     public int Id { get; set; } 
    } 

    public class SongData : ResponseData 
    { 
     [JsonProperty(PropertyName = "artist")] 
     public string Artist { get; set; } 

     [JsonProperty(PropertyName = "title")] 
     public string SongName { get; set; } 

     [JsonProperty(PropertyName = "url")] 
     public string SongUri { get; set; } 

     [JsonProperty(PropertyName = "duration")] 
     public int Duration { get; set; } 

     [JsonProperty(PropertyName = "owner_id")] 
     public int OwnerId { get; set; } 

     [JsonProperty(PropertyName = "lyrics_id")] 
     public int LyricsId { get; set; } 

     [JsonProperty(PropertyName = "genre_id")] 
     public int GenreId { get; set; } 
    } 

    public class UserData : ResponseData 
    { 
     [JsonProperty(PropertyName = "photo")] 
     public string Photo { get; set; } 

     [JsonProperty(PropertyName = "name")] 
     public string Name { get; set; } 

     [JsonProperty(PropertyName = "name_gen")] 
     public string NameGen { get; set; } 
    } 

    public class SongList 
    { 
     [JsonProperty(PropertyName = "count")] 
     public int Count { get; set; } 

     [JsonIgnore] 
     public List<SongData> Songs { get; set; } 

     [JsonIgnore] 
     public List<UserData> Users { get; set; } 

     [JsonProperty(PropertyName = "items")] 
     public ResponseData[] Items 
     { 
      get 
      { 
       return (Users ?? Enumerable.Empty<UserData>()).Cast<ResponseData>().Concat((Songs ?? Enumerable.Empty<SongData>()).Cast<ResponseData>()).ToArray(); 
      } 
      set 
      { 
       Songs = (value ?? Enumerable.Empty<ResponseData>()).OfType<SongData>().ToList(); 
       Users = (value ?? Enumerable.Empty<ResponseData>()).OfType<UserData>().ToList(); 
      } 
     } 
    } 

    public class ResponseDataConverter : JsonConverter 
    { 
     public override bool CanConvert(Type objectType) 
     { 
      return typeof(ResponseData).IsAssignableFrom(objectType); 
     } 

     public override object ReadJson(JsonReader reader, 
      Type objectType, object existingValue, JsonSerializer serializer) 
     { 
      JObject item = JObject.Load(reader); 
      if (item["name"] != null) 
      { 
       return item.ToObject<UserData>(); 
      } 
      else 
      { 
       return item.ToObject<SongData>(); 
      } 
     } 

     public override void WriteJson(JsonWriter writer, 
      object value, JsonSerializer serializer) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

я нужна помощь. Я потратил половину своего рабочего дня на эту проблему. Работа с IEnumerable <> Коллекция трудна. Так трудно. Может быть, я что-то пропустил, но я молод и просто учился.

+0

Это не совсем понятно, что вы просите - не могли бы вы перефразировать проблему, текущую ситуацию и ваши ожидаемые результаты более подробным и понятным образом? –

+0

Мне нужна коллекция, где будут только элементы с genreid == 18. Когда я получил все результаты от json, мне нужно отсортировать их в разных коллекциях по их genreid –

ответ

1

Так это мое понимание того, что вы после (исправьте меня, если я ошибаюсь).

У вас есть список песен (в данном случае songList.Songs), и вы хотите получить IEnumerable<> коллекцию всех композиций с genreid == 18 (или любым id).

Просто глядя на последней строке код (LINQ запрос) ... может быть что-то вроде ...

var songsWithId = from sd in songList.Songs 
         where sd.GenreId == 18 
         select sd; 

где songWithId является IEnumerable<SongData>

В своем коде вы только выбрать жанр Id (select other.GenreId), который заставляет меня думать, что я неправильно понял ваш вопрос.

+0

Прежде, в предыдущей версии C# вы можете получить список <> вместо IEnumerable <>. Получить любой элемент списка легко. Из IEnumerable <> Я получаю int32 вместо genreid number. Главное - отдельные песни с разными жанрами в разных коллекциях. Это был мой путь, но он не работал. Если у вас есть другой способ решить мою проблему. В любом случае, спасибо за ваш ответ. –

+0

Хм ... так что вы просите - это «Список ' ...? 'var songsWithId = (из sd в songList.Songs, где sd.GenreId == 18 select sd) .ToList();' – user1135469

+0

Это не то, что я искал, но вы отвечаете не плохо. Я знаю, как решить свою проблему, спасибо. Я буду использовать ответы и переопределить методы json. –

1

Я не знаю, почему вы явно заливкой результат запроса к int, вам нужно просто сделать это: -

IEnumerable<int> SongsWithGenreId18 = from other in songList.Songs 
             where other.GenreId == 18 
             select other.GenreId; 

Или, если вы хотите список напрямую, просто перечислить его ToList способом, как это: -

List<int> SongsWithGenreId18 = (from other in songList.Songs 
           where other.GenreId == 18 
           select other.GenreId).ToList(); 

Теперь вы можете добавить этот список в свою коллекцию, используя AddRange метод.

+0

Если песня genreid (например) == 18, мне нужно получить все песни с этим параметром. Все остальные песни будут отправлены в другую коллекцию. –

+0

@NikitaGalaganov: Да, этот запрос будет фильтровать все песни только с помощью GenreId 18, другой коллекции, как в? Очевидно, вам нужно написать отдельный запрос для этого. –

1

, если я вас правильно понял, я думаю, что это то, что вы ищете:

var songsWithSpecificGenreId = songList.Where(song => song.GenreId == 18); 
Смежные вопросы