2015-05-20 30 views
0

我在我的名单与已排序的数据搜索这样的:List.BinarySearch的Windows Phone

public class ShortWord: IComparable<ShortWord> 
{ 
    public int id { get; set; } 
    public string Word { get; set; } 

    public int CompareTo(ShortWord obj) 
    { 
     return this.Word.CompareTo(obj.Word); 
    } 
} 

List<ShortWord> words; 
words.Where(t => t.Word.IndexOf(text.ToUpper()) == 0).Take(30).ToList(); 

这是工作非常缓慢。我认为需要使用List.BinarySearch,但我不明白我怎么能用它作为我的例子。

我试图实现一些东西,但它不工作。

回答

1

因为比较的基础上的话,你可以输入单词创建新实例,并将其传递给BinarySearch方法:

List<ShortWord> words; 
int index = words.BinarySearch(new ShortWord() { 
    Word = text, 
}; 
if (index >= 0) { 
    ShortWord result = words[index]; 
} 

Accoring到MSDN,二分查找将使用实施IComparable.CompareTo方法:

此方法使用T 类型的默认比较器Comparer.Default来确定列表元素的顺序。如果可用,Comparer.Default 属性检查类型T是否实现IComparable通用接口并使用该实现。如果不是, Comparer.Default检查类型T是否实现IComparable 接口。如果类型T不实现任一接口,则 Comparer.Default将引发InvalidOperationException。

编辑:

如果可能与该列表中的同一个词的多个项目,你应该直到你得到不同的词项遍历从索引列表。

+0

我用你的例子,但我总是有负值 – romandrovich

+0

@romandrovich你的比较方法是区分大小写的,你认为? –

+0

是的。新的ShortWord(){Word = text.ToUpper()}在我的话中,所有已经ToUpper() – romandrovich