检查列表是否包含多个指定值

时间:2016-02-03 11:38:04

标签: c# asp.net-mvc linq razor umbraco

我有一个名为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测试总是失败并且没有意义。当前页面属于类别计算。您可以从我的调试中看到类别列表中有多个计算值

enter image description here

2 个答案:

答案 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)