我有一组对象。每个对象都有一个字符串属性。我试图获取这些对象的列表,其中字符串按字母顺序排列在指定字符串之前或之后。
以下是我的意思的一个例子:
我有四个对象,其字符串属性为apple
,banana
,carrot
和dirt
。我使用的指定字符串是c
。我想使用LINQ返回前两个对象,其字符串属性为apple
和banana
。作为奖励,包含carrot
的能力在同一语句中也很好,而不是为==
使用单独的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
的{{1}}值为selectedField
。 LOCATION
的{{1}}是我Value
与Key
的比较。
编辑2:问题似乎与套管有关。
答案 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“。