【问题标题】:Get a all specific elements with flag获取带有标志的所有特定元素
【发布时间】:2015-01-04 10:16:09
【问题描述】:

如果元素包含带有标志的特定元素,则获取它并添加到集合中。在我的代码中,这意味着 获取所有歌曲,其中genreid == 18 // 例如,number 可以是任何 int32//。我会很高兴看到任何答案。我使用 linq 来获取它,但我只看到那个数字是 int32 而没有别的。 这是我的代码:(歌曲列表是列表)

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 集合很难。太难了。可能是我错过了什么,但我还年轻,只是在学习。

【问题讨论】:

  • 您的问题并不完全清楚 - 请您以更详细、更清晰的方式重新表述您的问题、当前情况和您的预期结果吗?
  • 我想要收藏,其中只有genreid == 18的元素。当我从json获得所有结果时,我需要按他们的genreid将它们排序到不同的集合

标签: c# arrays linq collections ienumerable


【解决方案1】:

这就是我对你所追求的东西的理解(如果我错了,请纠正我)。

您有一个歌曲列表(在本例中为 songList.Songs),并且您想要获得一个 IEnumerable&lt;&gt; 集合,其中包含所有流派 ID == 18(或任何 ID)的歌曲。

看看你的最后一行代码(linq 查询)...可能类似于...

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

其中songWithIdIEnumerable&lt;SongData&gt;

在您的代码中,您只选择了类型 ID (select other.GenreId),这让我觉得我误解了您的问题。

【讨论】:

  • 之前,在以前的 c# 版本中,您可以获得 list 而不是 IEnumerable。获取列表的任何元素都很容易。从 IEnumerable 我得到 int32 而不是流派编号。要点是将具有不同流派的歌曲分开到不同的收藏。这是我的方式,但它没有工作。如果您有其他方法解决我的问题。不管怎样,谢谢你的回答。
  • 嗯...所以您要的是List&lt;SongData&gt;...? var songsWithId = (from sd in songList.Songs where sd.GenreId == 18 select sd).ToList();
  • 这不是我想要的,但你的回答一点也不差。我知道如何解决我的问题,谢谢。我将使用你的答案并覆盖我的 json 方法。
【解决方案2】:

我不确定您为什么将查询结果显式转换为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 方法将此列表添加到您的收藏中。

【讨论】:

  • 如果歌曲流派id(例如)== 18,我需要获取所有带有这个参数的歌曲。所有其他歌曲都将转到另一个收藏。
  • @NikitaGalaganov:是的,这个查询将过滤所有 GenreId 为 18 的歌曲,另一个集合?显然,您需要为此编写一个单独的查询。
【解决方案3】:

如果我理解正确,我想这就是你要找的:

var songsWithSpecificGenreId = songList.Where(song => song.GenreId == 18);

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2011-07-24
    • 1970-01-01
    相关资源
    最近更新 更多