【问题标题】:LINQ: Checking if a string (variable) contains any of the list of propertiesLINQ:检查字符串(变量)是否包含任何属性列表
【发布时间】:2011-04-25 09:41:27
【问题描述】:

我需要检查我的“常量”是否包含我收藏的任何项目的(字符串)。我的常数在这里:

  studentTest = "MathsTest"; // THis is a constant that doesn't change,
                                  // it is set on frmLoad

现在我的 linq 我需要它来查看 studentTest 是否包含在我的测试(集合)中具有 Name 属性的字符串。

现在 studentTest 始终是“某物”,末尾附加了“测试”,即 MathsTest、EnglishTest 等。

我的测试是一个“测试”列表,每个测试都有一个名为“名称”的属性,其中包含测试的名称减去单词 Test,即 English、Maths 等和“NOT”EnglishTest、MathsTest。

所以我需要检查我的“常量”是否包含每个测试的“名称”属性中可用的任何文本。

我试着在这里玩,但我有点迷茫,这是错误的方向。

     if ( test.Tests.Any(x => x.Type.Contains(studentTest)) )

【问题讨论】:

    标签: c# linq linq-to-objects


    【解决方案1】:

    有很多方法可以解决这个问题;一种方法是从studentTest 中删除“Test”后缀并搜索它:

    string type = studentTest.substring(0, studentTest.Length - 4);
    if (test.Tests.Select(t => t.Type).Contains(type)) { ... }
    

    或者,如果您更喜欢使用Any()

    if (test.Tests.Any(t => t.Type == type)) { ... }
    

    实际上,您显示的代码几乎是正确的,只是由于测试名称是studentTest的子字符串,因此应该是

    if (test.Tests.Any(x => studentTest.Contains(x.Type))) { ... }
    

    不过,我建议使用Substring(),因为如果其中一种测试类型实际上是"Test",最后一种方法会产生错误的结果(但在你的情况下不太可能)...

    【讨论】:

    • 是的,但它可能并不总是 4 个字符,甚至连单词 Test.... >
    • if (test.Tests.Any(x => studentTest.Contains(x.Name))) 或者不是?4
    • @Martin:啊;从您的问题来看,看起来所有测试名称都将以 "Test" 结尾。然后,Contains() 应该可以工作,但我更喜欢StartsWith()
    猜你喜欢
    • 2016-04-10
    • 2016-01-27
    • 1970-01-01
    • 2014-07-08
    • 2023-03-14
    • 2021-12-11
    • 1970-01-01
    • 2021-11-26
    • 2014-08-09
    相关资源
    最近更新 更多