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 Counterpart
s 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:
Counterpart
Code
is equal to search stringCounterpart
Code
starts with search stringCounterpart
Code
contains search stringCounterpart
Description
contains search stringCounterpart
Alias
is equal to search stringCounterpart
Alias
starts with search stringCounterpart
Alias
contains 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;
}
}