我相信我在这里缺少一些简单的东西,但我无法理解。任何形式的帮助将不胜感激。
问题:
最终在resultsWithMedia
数组中的结果仅包含与mediaTypesList
中的第一项匹配的结果。我尝试过使用Exists()
,Find()
和Contains()
,但没有运气。我每次都会得到同样的行为。
例如:如果mediaTypesList
包含{"video", "link", "photo"}
个值,则resultsWithMedia
只会保存video
类型的结果。
我想要实现的是让resultsWithMedia
保持type
与mediaTypesList
中的任何值匹配的值。
代码:
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();
}
}
答案 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();