【问题标题】:How can I query the contents of a List via LINQ based on string values?如何根据字符串值通过 LINQ 查询列表的内容?
【发布时间】:2013-11-12 19:22:19
【问题描述】:

我正在尝试使用 ">=" 为字符串列/成员查询记录集合。

我想要/期望的是,鉴于“音乐家”成员中的以下值,这样的条件会:

Clarence "Gatemouth" Brown
Merle Travis
Eddie Van Halen
Rory Gallagher
Elvin Bishop
Eric Clapton
Jimi Hendrix
Stevie Ray Vaughan
Robin Trower
Ritchie Blackmore
Carlos Santana
Mark Knopfler
Pete Anderson

...以及以下 LINQ 查询:

private readonly List<Musician> musicians = new List<Musician>();
. . .
public IEnumerable<Musician> Get(string musician)
{
    IEnumerable<Musician> Musicians = from m in musicians
                                      where m.musician >= musician
                                      select m;
    . . .

...将“Robin”作为“musician”参数传递,返回 Musician 的 IEnumerbale 集合,其中包含以下音乐家值的记录:

Robin Trower
Rory Gallagher
Stevie Ray Vaughan

(IOW,任何“大于”Robin,例如如果在 SQL 查询中使用“ORDER BY MUSICIAN”子句,从“Robin”开始出现的内容)。

然而,它并没有按预期工作,它甚至没有编译,我得到,“运算符'> ='不能应用于'string'和'string'类型的操作数”在“where m. LINQ 查询的音乐家 >= 音乐家”部分。

那么如何使用 LINQ 按字符串值过滤“记录”集合?

【问题讨论】:

  • 您可以使用string.Compare(m.musician, musician) &gt;= 0,但它仍然有点狡猾。我什至不确定 SQL 翻译。
  • 如果 Musician 是一个类,你需要重写操作符 >=.
  • @LuizFelipe 不,他在比较字符串,而不是 Musician 对象。
  • 哦,是的,很抱歉没有引起注意。

标签: c# string linq generics ienumerable


【解决方案1】:

您应该使用返回的 String.Compare(str1, str2):

  • 如果 str1 小于 str2,则小于零
  • 如果 str1 大于 str2,则大于零
  • 0 它 str1 等于 str2

Here is the link to the documentation

    var musicians = new List<string>()
    {
        "Clarence \"Gatemouth\" Brown",
        "Merle Travis",
        "Eddie Van Halen",
        "Rory Gallagher",
        "Elvin Bishop",
        "Eric Clapton",
        "Jimi Hendrix",
        "Stevie Ray Vaughan",
        "Robin Trower",
        "Ritchie Blackmore",
        "Carlos Santana",
        "Mark Knopfler",
        "Pete Anderson",
    };

    var musician = "Robin";
    var newMusicians = musicians.Where(m => 0 < String.Compare(m,  musician));

    MessageBox.Show(String.Join(Environment.NewLine, newMusicians.ToArray()));

或者,如果您更喜欢类似 sql 的语法:

var newMusicians = from m in musicians
                where 0 < String.Compare(m, musician)
                select m;

【讨论】:

  • 类 sql 语法的 where 部分不是必须是: where 0
  • @ClayShannon 在你的情况下是的,确实如此。但是由于您没有提供您的音乐家课程,我即兴创作并在一个简单的字符串列表上运行它。我提供的剪辑编译并给出了预期的结果。通过你提到的那个轻微的修改,它会给你你所需要的:)
【解决方案2】:

我认为您可能正在寻找类似以下的内容,它可以在搜索字符串的任何位置找到给定的子字符串。但是,它不会搜索搜索条件字符串的每个可能的子字符串。

IEnumerable<Musician> Musicians = musicians.Where(m => m.IndexOf(musician, StringComparison.CurrentCultureIgnoreCase) >= 0);

【讨论】:

  • 在字符串中查找子字符串。这是查看是否存在任何字符,而子字符串将验证所有字符是否按顺序存在。
【解决方案3】:
var newList = myList.OrderBy(m => m).Where(m => string.Compare(m, "Robin") > 0);

其中 myList 是您的字符串值列表。

【讨论】:

    【解决方案4】:

    您可以像这样在 LINQ 查询中使用 String.Compare:

    IEnumerable<Musician> Musicians = from m in musicians
                                              where String.Compare(m.musician, musician) > 0
                                              select m;
    

    【讨论】:

      【解决方案5】:
      var Musicians = MusicianList
                .Where(m => string.Compare(m.musician, musician) >= 0)
                .OrderBy(m=>m.musician);
      

      返回您想要的结果

      【讨论】:

        【解决方案6】:

        将您的查询替换为:

        IEnumerable<Musician> Musicians = from m in musicians
                                          where string.Compare(m.musician, musician, true) > 0
                                          select m;
        

        【讨论】:

          猜你喜欢
          • 2011-01-10
          • 1970-01-01
          • 2020-10-05
          • 1970-01-01
          • 1970-01-01
          • 2023-02-07
          • 1970-01-01
          • 1970-01-01
          • 2019-05-22
          相关资源
          最近更新 更多