代码之家  ›  专栏  ›  技术社区  ›  pfinferno

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

  •  0
  • pfinferno  · 技术社区  · 7 年前

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

    以下是我的意思的一个例子: 我有四个字符串属性为 apple , banana , carrot dirt . 我使用的指定字符串是 c . 我想使用linq返回前两个具有字符串属性的对象 苹果 香蕉 . 作为奖励,包括 胡萝卜 在同一条语句中也很好,而不是使用单独的linq查询 == .

    以下是我尝试过的(以及它的变体):

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

    在哪里? features 是我的收藏。

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

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

    Feature 对象有 Dictionary<string, string> 打电话 ColumnValues . 这个 Key 价值,这是我的 selectedField LOCATION . 这个 Value 为此 钥匙 是我比较的 stringToCompare 为每个 特征 .

    编辑二:问题似乎出在弹壳上。

    1 回复  |  直到 7 年前
        1
  •  3
  •   ashish    7 年前

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

        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。我将columnvalues字段作为具有要比较的字符串的字段。因为原始字符串中可以有任意数量的字符,所以这里的顺序比较是正确的方法。

    在这个例子中,我取了变量 勒诺夫斯特朗 但是你可以根据字符串的长度来定义它,因为这里的长度是“1”(我们比较的是“c”),所以我把长度设置为“1”。