Say I have the following 

```
var searches = new ObservableCollection<Book>();

```

`searches` contains the book objects

```
public class Book
{
    public string Title { get; set;}
    public string Desc {get; set;}    
}

```

I want to sort `searches` by a matching string. First it checks the `Title` than rank them based on how close the search string from the beginning of `Title`. Next it checks `Desc` and rank them by how close the search string appears from the beginning of the `Desc.

For example if I have

> 
> Book 1  
> 
>  Title: ABC Book Title  
> 
>  Desc: The description of book 1
> 
> 
> Book 2  
> 
>  Title: Book Title Only  
> 
>  Desc: There's an ABC in the description of book 2
> 
> 
> Book 3  
> 
>  Title: Book Title ABC  
> 
>  Desc: ABC is in the beginning 
> 
> 
> 

So let say the search keyword is `ABC`, I want `searches` to be sorted so that I get the following. The result place higher priority to items that contains the search string in the title.

> 
> Book 1  
> 
>  Title: ABC Book Title  
> 
>  Desc: The description of book 1 
> 
> 
> Book 3  
> 
>  Title: Book Title ABC  
> 
>  Desc: ABC is in the beginning 
> 
> 
> Book 2  
> 
>  Title: Book Title Only  
> 
>  Desc: There's an ABC in the description of book 2
> 
> 
> 

How do I achieve this using LINQ?