使用LINQ按字母顺序比较字符串

时间:2018-06-15 16:29:59

标签: c# linq

我有一组对象。每个对象都有一个字符串属性。我试图获取这些对象的列表,其中字符串按字母顺序排列在指定字符串之前或之后。

以下是我的意思的一个例子: 我有四个对象,其字符串属性为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个对象的Dictionary<string, string>名为ColumnValues。我Key的{​​{1}}值为selectedFieldLOCATION的{​​{1}}是我ValueKey的比较。

编辑2:问题似乎与套管有关。

1 个答案:

答案 0 :(得分:3)

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

    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);

这会返回值apple,banana和carrot.I已将ColumnValues字段作为具有要比较的字符串的字段。因为原始字符串中可以有任意数量的字符,所以OrdinalComparison是正确的方法。

在这个例子中,我把变量 lenOfString 作为“1”但你可以根据字符串的长度适当地定义它。因为这里长度为“1” “(我们正在比较”c“),我将长度设为”1“。