获取带有标志的所有特定元素
Get a all specific elements with flag
如果元素包含带有标志的特定元素,获取它并添加到集合中。在我的代码中这意味着
获取所有歌曲,其中 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;
如果这对你有帮助,这是我的反序列化 class:(使用重写方法)
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<> 集合很困难。太难了。可能是我错过了什么,但我还年轻,正在学习。
这就是我对你的理解(如果我错了请纠正我)。
您有一个歌曲列表(在本例中为 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
),这让我觉得我误解了您的问题。
我不确定您为什么将查询结果显式转换为 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 方法将此列表添加到您的 collection。
如果我没理解错的话,我想这就是你要找的:
var songsWithSpecificGenreId = songList.Where(song => song.GenreId == 18);
如果元素包含带有标志的特定元素,获取它并添加到集合中。在我的代码中这意味着 获取所有歌曲,其中 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;
如果这对你有帮助,这是我的反序列化 class:(使用重写方法)
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<> 集合很困难。太难了。可能是我错过了什么,但我还年轻,正在学习。
这就是我对你的理解(如果我错了请纠正我)。
您有一个歌曲列表(在本例中为 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
),这让我觉得我误解了您的问题。
我不确定您为什么将查询结果显式转换为 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 方法将此列表添加到您的 collection。
如果我没理解错的话,我想这就是你要找的:
var songsWithSpecificGenreId = songList.Where(song => song.GenreId == 18);