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