我有一个字符串数组,我需要得到所有的字符串,以‘前缀’开头。我想使用Array.BinarySearch()。有可能吗?如果是的话,我应该怎么写比较者呢?
发布于 2014-11-19 07:29:10
不,在这种情况下不能使用BinarySearch
。您可以使用Enumerable.Where
代替:
Dim query = From str In array Where str.StartsWith("prefix")
或者使用(ugly in VB.NET)方法synatx:
query = array.Where(Function(str) str.StartsWith("prefix"))
编辑:哇,C#
var query = array.Where(s => s.StartsWith("prefix"));
如果要创建新的筛选数组,请使用ToArray
。
发布于 2015-04-20 16:01:18
很容易创建自己的StartsWithComparer:
class StartsWithComparer : IComparer<string>
{
public int Compare(string a, string b) {
if(a.StartsWith(b)) {
return 0;
}
return a.CompareTo(b);
}
}
正如其他人指出的那样,这只会返回一个指数。您可以有几个助手来退还所有物品:
IEnumerable<string> GetBefore(IList<string> sorted, int foundIndex, string prefix) {
for(var i = foundIndex - 1; i >= 0; i--) {
if(sorted[i].StartsWith(prefix)) {
yield return sorted[i];
}
}
}
IEnumerable<string> GetCurrentAndAfter(IList<string> sorted, int foundIndex, string prefix) {
for(var i = foundIndex; i < sorted.Count; i++) {
if(sorted[i].StartsWith(prefix)) {
yield return sorted[i];
}
}
}
然后使用它:
var index = sorted.BinarySearch("asdf", new StartsWithComparer());
var previous = GetBefore(sorted, index, "asdf");
var currentAndAfter = GetCurrentAndAfter(sorted, index, "asdf");
您可以使用一个返回以前缀开头的所有项的方法将整个过程包装在自己的类中。
https://stackoverflow.com/questions/27020583
复制