无法获得正确的结果

时间:2013-01-02 18:13:37

标签: c# linq

我相信我在这里缺少一些简单的东西,但我无法理解。任何形式的帮助将不胜感激。

问题: 最终在resultsWithMedia数组中的结果仅包含与mediaTypesList中的第一项匹配的结果。我尝试过使用Exists()Find()Contains(),但没有运气。我每次都会得到同样的行为。

例如:如果mediaTypesList包含{"video", "link", "photo"}个值,则resultsWithMedia只会保存video类型的结果。

我想要实现的是让resultsWithMedia保持typemediaTypesList中的任何值匹配的值。

代码

 public void GetPostsWithMedia(string from, string before, string mediaTypes)
    {
        // ... some variable declarations

        List<string> mediaTypesList = new List<string>();

        if (!string.IsNullOrEmpty(mediaTypes))
        {
            var list = mediaTypes.Split(',');

            foreach (var type in list)
            {
                mediaTypesList.Add(type);
            }
        }

        // ... some more code 

        // Note: r.Data is a Dictionary that contains strings as it's values
        var resultsWithMedia = (from r in response.Results
                                where r.Data.ContainsKey("Type") && mediaTypesList.Exists(t => t == r.Data["Type"]) 
                                select new 
                                {
                                    // ... different variables
                                }).ToArray();

        }
    }

4 个答案:

答案 0 :(得分:1)

您可以在一个查询中获得包含媒体的结果:

var query = from r in response.Results.Where(x => x.Data.ContainsKey("Type"))
            join m in mediaTypes.Split(',')
                 on r.Data["Type"] equals m
            select new {
                ...
            };

如果您需要对媒体类型和数据进行不区分大小写的比较,请应用ToLower():on r.Data["Type"].ToLower() equals m.ToLower()。如果在分割字符串后媒体类型名称中有空格,请考虑应用m.Trim()(如Euphoric建议的那样)。

答案 1 :(得分:1)

我稍微改写了你的代码。

var mediaTypesList = mediaTypes.Split(',').Select(e => e.Trim()).ToList();

var resultsWithMedia = response.Results.Data.Where(e => e.ContainsKey("Type") && mediaTypesList.Contains(e["Type"]))
            .Select(a => new {
                              // ... different variables
                              }).ToArray();

对我来说看起来更简单。

答案 2 :(得分:0)

mediaTypes

之前和之后检查,中的空格

最好改变

mediaTypesList.Add(type.Trim());

答案 3 :(得分:-1)

如果我理解正确你想要通过第一个元素匹配。 Enumerable.First()会做到这一点:

   var resultsWithMedia = (from r in response.Results
                            where r.Data.ContainsKey("Type") && 
                            mediaTypesList.First(t => t == r.Data["Type"]) 
                            select new 
                            {
                                // ... different variables
                            }).ToArray();