【问题标题】:Check to see if a list contains more than one specified value检查列表是否包含多个指定值
【发布时间】:2016-02-03 11:38:03
【问题描述】:

我有一个名为 blogCategoriesList 的列表(它是字符串类型),当它通过检查类别下拉属性中定义的值来循环遍历每个页面时,该列表填充了每个博客类别的值。因此,如果我的网站上有三篇博客文章,并且类别被定义为足球、飞镖、飞镖,那么这就是列表将包含的内容。

我正在尝试做一个 if 检查来验证是否

  • 列表中包含的值与 当前页面
  • 列表包含多个与 当前页面的类别

例子

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

【问题讨论】:

  • blogCategoriesList.Where(c => c == category).Count() > 1?
  • blogCategoriesList.Where(c => c == category).Skip(1).Any()?无需扫描所有列表即可找出Count(),例如1234567
  • @Paul 查看我的答案的编辑。
  • 不需要Contains() Count()。如果计数 > 0,则包含逻辑上为真。请检查@Model.Content.GetPropertyValue("category")的实际类型,我怀疑它是object
  • @CodeCaster 你是绝对正确的。那是一个物体。我将它存储在一个 var (var currentPageCategory = Model.Content.GetPropertyValue("category").ToString();) 中并转换为字符串,它解决了这个问题。感谢大家的帮助。那么我将哪个标记为答案?

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


【解决方案1】:

如果是列表

  if (blogCategoriesList.Where(c => c == category).Skip(1).Any()) {
    ...
  }

将比Count 更快的解决方案:无需计算确切数量的项目(例如,1234567),因为这个数字超过了1

【讨论】:

  • @Fᴀʀʜᴀɴ Aɴᴀᴍ:是的,更快没有列表完整扫描
【解决方案2】:

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 个条目,因为它测试reference 相等性。

要将属性作为字符串获取,请使用GetPropertyValue&lt;string&gt;(),这将使您的代码正常工作。或者将针显式地投射到字符串中:

Where(s => s == (string)needle)

【讨论】:

  • 谢谢你我意识到了这一点:)
猜你喜欢
  • 2013-02-08
  • 2019-07-04
  • 2014-05-26
  • 2012-09-17
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
相关资源
最近更新 更多