C# 选择linq最适合查询字符串的对象
我有一种情况,我试图将两个不同的数据源链接在一起。请参阅下面的代码:C# 选择linq最适合查询字符串的对象,c#,json,linq,C#,Json,Linq,我有一种情况,我试图将两个不同的数据源链接在一起。请参阅下面的代码: static void Main(string[] args) { string url = System.Net.WebUtility.UrlDecode("yql"); HttpClient cl = new HttpClient(); var response = cl.GetStringAsync(url).Result; JObject json = JObject.Parse(re
static void Main(string[] args)
{
string url = System.Net.WebUtility.UrlDecode("yql");
HttpClient cl = new HttpClient();
var response = cl.GetStringAsync(url).Result;
JObject json = JObject.Parse(response);
var ids = from p in json["p"]
from span in p["span"]
where (string)span["content"] == "01/19/2017"
select (string)span["genre"];
}
这就是JSON在这里的代码
请注意,这个JSON与您将从yql获得的有点不同,因为我缩短了它,删除了不需要的位。这是
链接到完整的JSON-*%20,来自%20html%20其中%20url%3D%22http%3A%2F%2Fthemoviedb.org%2Fsearch%2Fmovie%3Fquery%3Dsplit%22%20%20和%20xpath%3D'%2F%2Fdiv%5B%40class%3D%22info%22%5D'&格式=JSON和回调=
我希望能够查询JSON并选择最符合以下条件的对象:
string year = "2017";
string genre = "Drama, Thriller, Action";
string title = "split"
或
然后
从查询对象和来自yql的JSON。。。结果应于2017年1月19日拆分
public class Movie
{
public string Year { get; set; }
public string Title { get; set; }
public string[] Genre { get; set; }
}
class Program
{
static void Main(string[] args)
{
string url = System.Net.WebUtility.UrlDecode("https://query.yahooapis.com/v1/public/yql?q=SELECT%20*%20FROM%20html%20WHERE%20url%3D%22http%3A%2F%2Fthemoviedb.org%2Fsearch%2Fmovie%3Fquery%3Dsplit%22%20%20AND%20xpath%3D%27%2F%2Fdiv%5B%40class%3D%22info%22%5D%27&format=json&callback=");
HttpClient cl = new HttpClient();
var response = cl.GetStringAsync(url).Result;
JObject json = JObject.Parse(response);
var movies = new List<Movie>();
foreach (var pchild in json["query"]["results"]["div"])
{
// title
var title = pchild["p"][0]["a"]["title"];
var titleStr = title != null ? title.Value<string>() : string.Empty;
// year
var releaseDate = pchild["p"][1]["span"][0]["content"];
string releaseYear = string.Empty;
DateTime temp;
if (releaseDate != null
&& DateTime.TryParse(releaseDate.Value<string>(), System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None, out temp))
{
releaseYear = temp.Year.ToString();
}
// genres
var genre = pchild["p"][1]["span"][1]["content"];
var genreArr = genre != null
? genre.Value<string>()
.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)
.Select(st => st.Trim())
.ToArray()
: new string[0];
movies.Add(
new Movie
{
Title = titleStr,
Year = releaseYear,
Genre = genreArr
});
}
// searching for the best match
string titleFilter = "Split";
string yearFilter = "2017";
var genreFilter = new string[] { "Drama", "Thriller", "Action" };
var bestMatches = movies
.OrderByDescending(m => m.Title == titleFilter)
.ThenByDescending(m => m.Year == yearFilter)
.ThenByDescending(m => m.Genre.Intersect(genreFilter).Count());
// the best match
var bestMatch = bestMatches.First();
Console.WriteLine(bestMatch.Title);
Console.WriteLine(bestMatch.Year);
Console.WriteLine(string.Join(",", bestMatch.Genre));
// all the movies already ordered
//foreach (var movie in bestMatches)
//{
// Console.WriteLine(movie.Title);
// Console.WriteLine(string.Join(",", movie.Genre));
// Console.WriteLine(movie.Year);
// Console.WriteLine();
//}
Console.ReadLine();
}
最佳匹配:
Split
2017
Drama,Horror,Thriller
请注意,您可能有多部电影具有相同的匹配项。
输入:
最佳匹配您可以取消注释代码的最后一部分以查看订购的所有电影:
Split
Fantasy,Drama
2016
Split
Drama
2016
我想你指的是JSON而不是Jason。JSON是JavaScript对象表示法的缩写。我可能错了,你的意思是杰森,但我从没听说过如果:这是拼写错误,多亏了拼写检查。我是说JSON这就是Jason的样子请编辑问题并插入你所说的JSON。我现在不在我的电脑上,但如果你将我包含的链接复制到你的浏览器中,你会得到JSON。你说的最佳匹配到底是什么意思?谢谢Roberto。。。事实上,我是用linq算出的。我认为你的逻辑和我的相比是很简单的。我将重构我的代码。谢谢你。你好,佩德罗,我在你的图案上发现了一个错误。。。如果Json对象正好是一个,那么代码就会崩溃。看看我的这个链接是什么意思-*%20来自%20html%20其中%20url%3D'https%3A%2F%2Fwww.themoviedb.org%2Fsearch%2Fmovie%3Fquery%3DResident%2b邪恶:%2BFinal%2BChapter'%20和%20xpath%3D'%2F%2Fdiv%5B%40class%3D%22info%22%5D'&format=json&callback=要绕过它,你必须删除for-each循环并直接访问该值,但要这样做如果您有多个对象,则只会给您一个对象。我无法访问此url。我有一个查询语法错误。你能验证一下网址吗?到这里
string titleFilter = "Split";
string yearFilter = "2017";
var genreFilter = new string[] { "Drama", "Thriller", "Action" };
Split
2017
Drama,Horror,Thriller
string titleFilter = "Split";
string yearFilter = "2016";
var genreFilter = new string[] { "Drama", "Thriller", "Action" };
Split
Fantasy,Drama
2016
Split
Drama
2016