C# 检查x是否以y开头的字符串的IComparer

C# 检查x是否以y开头的字符串的IComparer,c#,icomparer,startswith,C#,Icomparer,Startswith,我有一个字符串数组,我需要得到所有以“前缀”开头的字符串。我想使用Array.BinarySearch()。可能吗?如果是这样,我应该如何编写比较器?不,在这种情况下不能使用BinarySearch。您可以使用可枚举。其中: Dim query = From str In array Where str.StartsWith("prefix") 或使用(在VB.NET中)方法synatx: query = array.Where(Function(str) str.StartsWith("pr

我有一个字符串数组,我需要得到所有以“前缀”开头的字符串。我想使用Array.BinarySearch()。可能吗?如果是这样,我应该如何编写比较器?

不,在这种情况下不能使用
BinarySearch
。您可以使用
可枚举。其中

Dim query = From str In array Where str.StartsWith("prefix")
或使用(在VB.NET中)方法synatx:

query = array.Where(Function(str) str.StartsWith("prefix"))
编辑:哇,C#


如果要创建新的筛选数组,请使用
ToArray

否,在这种情况下不能使用
BinarySearch
。您可以使用
可枚举。其中

Dim query = From str In array Where str.StartsWith("prefix")
或使用(在VB.NET中)方法synatx:

query = array.Where(Function(str) str.StartsWith("prefix"))
编辑:哇,C#


如果要创建新的筛选数组,请使用
ToArray

使用Comparer轻松创建自己的启动:

class StartsWithComparer : IComparer<string>
{
    public int Compare(string a, string b) {
        if(a.StartsWith(b)) {
            return 0;
        }
        return a.CompareTo(b);
    }
}

您可以在自己的类中封装整个内容,使用一个方法返回以前缀开头的所有项目。

创建自己的StartWithComparer很容易:

class StartsWithComparer : IComparer<string>
{
    public int Compare(string a, string b) {
        if(a.StartsWith(b)) {
            return 0;
        }
        return a.CompareTo(b);
    }
}


您可以在自己的类中封装整个内容,使用一个方法返回以前缀开头的所有项目。

BinarySearch
用于在排序数组中查找一个项目,这意味着您必须根据该条件对数组进行预排序。如果这是您想要的,那么这是可能的,但是使用普通的搜索路由可能更合适。如果要查找以值开头的所有项目,则
BinarySearch
根本不起作用。即使可以完成,它也不会比线性搜索更有效。二进制搜索的要点是在同一集合上使用它进行多个搜索。如果仅用于一次搜索,仅对数组进行排序将比单个线性搜索花费更长的时间。在对答案的评论中,您提到您有一个100k字符串的已排序列表,以及另一个10k前缀的(也已排序?)列表。你想解决的实际问题是什么@SimonSvensson,我需要从100000个已排序单词列表中为10000个已排序前缀列表中的每个前缀获取10个单词,这样任何前缀都会重叠(例如,它是否包含
Foo
Foobar
?前缀列表是否已排序?
BinarySearch
用于在已排序的数组中查找一个项目,这意味着您必须根据该条件对数组进行预排序。如果这是您想要的,那么这是可能的,但使用正常的搜索路由可能更合适。)。如果要查找以值开头的所有项目,则
BinarySearch
根本不起作用。即使可以完成,它也不会比线性搜索更有效。二进制搜索的重点是在同一集合上使用它进行多个搜索。如果只在一个搜索中使用它,则只需对数组进行排序即可比单一线性搜索更长。在对答案的评论中,您提到您有一个100k字符串的排序列表,还有一个(也排序?)10k个前缀的列表。你想解决的实际问题是什么?@SimonSvensson,我需要从100000个已排序单词列表中获取10个单词,然后从10000个已排序前缀列表中获取每个前缀。是否有前缀重叠(例如,它是否包含
Foo
Foobar
?前缀列表是否已排序?问题是,我有100000个已排序单词的列表和10000个前缀的列表。因此10000个Where操作符调用占用了太多时间。因此我决定使用BinarySearch。这个决定有意义吗?@sware没有,因为
BinarySe。)arch
只返回一个索引,您必须为每个前缀对数组进行排序,这将比线性搜索花费更长的时间。@DStanley,如果我得到了所有前缀和所有以一个字母开头的单词呢?因此我不需要对数组进行排序。您可以执行自己的二进制搜索,以找到与前缀匹配的第一项,然后扫描w前缀仍然匹配。
BinarySearch
对您没有帮助,因为它返回一个索引(不一定是第一个索引)。问题是我有100000个已排序单词的列表和10000个前缀的列表。所以10000次Where运算符调用花费了太多时间。所以我决定使用BinarySearch。这个决定有意义吗?@Swarm没有,因为
BinarySearch
只返回一个索引,而您必须为每个前缀对数组进行排序,这将ld比线性搜索花费的时间更长。@DStanley,如果我得到了所有前缀和所有以一个字母开头的单词呢?因此我不需要对数组进行排序。您可以实现自己的BinarySearch来查找与前缀匹配的第一项,然后在前缀仍然匹配的情况下进行扫描。
BinarySearch
对您没有帮助,因为它会返回e索引(不一定是第一个索引)。