用于检查x是否以y开头的字符串的IComparer

时间:2014-11-19 15:26:37

标签: c# icomparer startswith

我有一系列字符串,我需要获取所有字符串,从一些'前缀'开头。我想使用Array.BinarySearch()。可能吗?如果是这样我应该如何编写比较器?

2 个答案:

答案 0 :(得分:3)

不,在这种情况下你不能使用BinarySearch。您可以改为使用Enumerable.Where

Dim query = From str In array Where str.StartsWith("prefix")

或使用(VB.NET中的ugly)方法synatx:

query = array.Where(Function(str) str.StartsWith("prefix"))

修改:whoops,C#

var query = array.Where(s => s.StartsWith("prefix"));

如果要创建新的过滤数组,请使用ToArray

答案 1 :(得分:1)

创建自己的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");

您可以使用一个返回所有以前缀开头的项目的方法将整个事物包装在您自己的类中。