I have to perform on some collection and return ranking based on some logic I wish to optimize this working code since I think it can be bettered (maybe using tasks?).
I need to search on Counterparts item. I load this data from DB and I've got more aliases per counterpart.
I need to return the result based on those criteria:
CounterpartCodeis equal to search stringCounterpartCodestarts with search stringCounterpartCodecontains search stringCounterpartDescriptioncontains search stringCounterpartAliasis equal to search stringCounterpartAliasstarts with search stringCounterpartAliascontains search string
Each of those rules starts from Ranking 1 to 7 and I have to sort ok that ranking ascending.
public class Counterpart
{
public int Id { get; set; }
public string Code { get; set; }
public string Description { get; set; }
public IEnumerable<Alias> Aliases { get; set; }
public override bool Equals(object obj)
{
Counterpart obj2 = obj as Counterpart;
if (obj2 == null) return false;
return Id == obj2.Id;
}
}
public class Alias
{
public int? Type { get; set; }
public string Description { get; set; }
}
internal class CounterPartRanking
{
public int Rank { get; set; }
public Counterpart CounterPart { get; set; }
}
public static class CounterpartExtensions
{
public static IEnumerable<Counterpart> SearchWithRank(this IEnumerable<Counterpart> source, string pattern)
{
var items1 = source.Where(x => x.Code == pattern);
var items2 = source.Where(x => x.Code.StartsWith(pattern));
var items3 = source.Where(x => x.Code.Contains(pattern));
var items4 = source.Where(x => x.Description.Contains(pattern));
var items5 = source.Where(x => x.Aliases != null && x.Aliases.Any(y => y.Description == pattern));
var items6 = source.Where(x => x.Aliases != null && x.Aliases.Any(y => y.Description.StartsWith(pattern)));
var items7 = source.Where(x => x.Aliases != null && x.Aliases.Any(y => y.Description.Contains(pattern)));
Stopwatch sw = Stopwatch.StartNew();
var rankedItems = new List<CounterPartRanking>();
if (items1.Any())
rankedItems.AddRange(items1.Select(x => new CounterPartRanking { Rank = 1, CounterPart = x }));
if (items2.Any())
rankedItems.AddRange(items2.Select(x => new CounterPartRanking { Rank = 2, CounterPart = x }));
if (items3.Any())
rankedItems.AddRange(items3.Select(x => new CounterPartRanking { Rank = 3, CounterPart = x }));
if (items4.Any())
rankedItems.AddRange(items4.Select(x => new CounterPartRanking { Rank = 4, CounterPart = x }));
if (items5.Any())
rankedItems.AddRange(items5.Select(x => new CounterPartRanking { Rank = 5, CounterPart = x }));
if (items6.Any())
rankedItems.AddRange(items6.Select(x => new CounterPartRanking { Rank = 6, CounterPart = x }));
if (items7.Any())
rankedItems.AddRange(items7.Select(x => new CounterPartRanking { Rank = 7, CounterPart = x }));
sw.Stop();
Debug.WriteLine("Time elapsed {0} for {1}", sw.Elapsed, pattern);
var items = rankedItems.OrderBy(x => x.Rank).Select(x => x.CounterPart);
var distinct = items.Distinct();
return distinct;
}
}