【问题标题】:Using LINQ to compare strings alphabetically使用 LINQ 按字母顺序比较字符串
【发布时间】:2023-03-12 16:23:01
【问题描述】:

我有一个对象集合。每个对象都有一个字符串属性。我正在尝试获取字符串在指定字符串之前或之后按字母顺序排列的那些对象的列表。

这是我的意思的一个例子: 我有四个字符串属性为applebananacarrotdirt 的对象。我使用的指定字符串是c。我想使用 LINQ 返回字符串属性为applebanana 的前两个对象。作为奖励,在同一语句中包含 carrot 的能力也会很好,而不是对 == 使用单独的 LINQ 查询。

这是我尝试过的(及其变体):

var query = from feature in features
            where String.Compare(feature.ColumnValues[selectedField], stringToCompare, StringComparison.OrdinalIgnoreCase) < 0
            select feature;

features 是我的收藏。

但这并没有返回正确的对象。它返回按字母顺序出现在前后的对象。

编辑:无法发布完整的集合,因为它有数千个对象,但要比较的字符串都是位置。比如In USMarylandNear Texas

Feature 对象有一个名为 ColumnValuesDictionary&lt;string, string&gt;Key 值,即我的selectedFieldLOCATION。那个KeyValue 是我将我的stringToCompare 与每个Feature 进行比较。

编辑 2:问题似乎出在套管上。

【问题讨论】:

  • 这并没有返回正确的对象。它返回了什么?
  • 尝试使用排序字典。
  • 更新了我的答案。如果字符串中有空格,是否会以某种方式将其按顺序降低?例如,我有一个字符串In US,当我将它与“B”进行比较时,它会在查询中返回。
  • 这段代码对我来说适用于“apple”、“banana”、“carrot”、“dirt”测试数据。与“c”相比,它返回​​“apple”、“banana”(0)。但是,我已经使用字符串列表而不是您的 feature 对象对其进行了测试。介意提供MCVE吗?
  • “在美国”应该是 &gt;“B”。比较会逐个字符进行,所以空格没有影响。

标签: c# linq


【解决方案1】:

我尝试了您上面提供的代码。您可以使用以下过滤和排序列表:

    public class Feature
    {

        public int Id { get; set; }
        public string ColumnValues { get; set; }
    }

  var features = new List<Feature> { new Feature {Id=1,ColumnValues="carrot" } ,
                 new Feature {Id=1,ColumnValues="dirt" },
                  new Feature {Id=1,ColumnValues="banana" }, new Feature {Id=1,ColumnValues="apple" }
            };

  string strToComapre = "c";
  int lenOfString = 1;

 var query=(from feature in features
                  where String.CompareOrdinal(feature.ColumnValues, 0, strToComapre, 0, lenOfString) <= 0
         select feature).OrderBy(x => x.ColumnValues);

这是返回值苹果、香蕉和胡萝卜。我将 ColumnValues 字段作为具有要比较的字符串的字段。由于原始字符串中可以有任意数量的字符,所以 OrdinalComparison 是正确的方法。

在此示例中,我将变量 lenOfString 设为“1”,但您可以根据字符串的长度适当地定义它。因为这里的长度是“1” "(我们比较的是"c"),我把长度设置为"1"。

【讨论】:

  • 感谢您的回答。该代码适用于一小部分功能,但不适用于我正在使用的数千个项目。我更新了我的帖子,希望能给我正在使用的对象提供一个更好的例子。我不知道为什么它不起作用,因为它适用于较短的相同值列表。
猜你喜欢
  • 2022-01-02
  • 2013-10-22
  • 2018-05-17
  • 2019-11-04
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 2013-12-25
相关资源
最近更新 更多