我有一个名为blogCategoriesList(类型为字符串)的列表,该列表填充了每个博客类别的值,因为它通过检查类别下拉属性中定义的值来遍历每个页面。因此,如果我在我的网站上有三篇博客帖子,并且类别被定义为足球,飞镖,飞镖那么这就是列表所包含的内容。
我正在尝试检查验证是否
实施例
blogCategoriesList =足球,飞镖,飞镖
如果我在一个将类别设置为飞镖的页面上,那么if测试应该通过,因为该列表包含飞镖,并且它在列表中还有多个用于飞镖的条目。
blogCategoriesList =足球,计算机,飞镖
如果我在一个将类别设置为飞镖的页面上,则if测试将失败,因为该列表包含飞镖,但它在列表中没有多个用于飞镖的条目。
我一直在尝试使用以下使用groupby的代码,但目前正在努力使其工作。
@if (blogCategoriesList.Contains(Model.Content.GetPropertyValue("category")) && blogCategoriesList.GroupBy(n => n.Equals(Model.Content.GetPropertyValue("category"))).Any(c => c.Count() > 1))
任何帮助都会很棒
非常感谢
保
编辑*所以使用下面的建议我已将我的代码更新为
@if (blogCategoriesList.Contains(@Model.Content.GetPropertyValue("category")) && blogCategoriesList.Where(x => x == @Model.Content.GetPropertyValue("category")).Count() > 1)
@if (blogCategoriesList.Contains(@Model.Content.GetPropertyValue("category")) && blogCategoriesList.Where(x => x == @Model.Content.GetPropertyValue("category")).Skip(1).Any())
但是现在我的if测试总是失败并且没有意义。当前页面属于类别计算。您可以从我的调试中看到类别列表中有多个计算值
答案 0 :(得分:8)
如果长列表
if (blogCategoriesList.Where(c => c == category).Skip(1).Any()) {
...
}
比Count
解决方案更快:没有必要计算确切数量的项目(例如,1234567
),只是这个数字超过{{1 }}
答案 1 :(得分:0)
return type of Umbraco's @Model.Content.GetPropertyValue()
is object
。
这导致您的比较(以及您的代码)失败,请参阅Compare string and object in c#和这个小型演示:
var stringList = new List<string>
{
"foo",
"bar",
};
// prevent string interning, which will cause reference equality to be true
object needle = "fo";
needle = (string)needle + "o";
bool listContainsNeedle = stringList.Contains(needle);
var needleInList = stringList.Where(s => s == needle).ToList();
现在listContainsNeedle
将是true
(因为它实际上进行了字符串比较),但needleInList
将有0个条目,因为它会测试引用的相等性。
要将属性作为字符串获取,请使用GetPropertyValue<string>()
,这将使您的代码正常工作。或者明确地将针头扎成绳子:
Where(s => s == (string)needle)