我會建議使用一個簡單的緩存來填充所有的寶石和他們使用比較器的順序。
// Use your Uow.Gems.GetAll() list of gems
string[] gems = new string[] { "F12", "T16", "K15", "F10", "K14", "T9", "T7", "A12", "A11" };
string input = "A12";
//Cache it something like this Uow.Gems.GetAll().OrderBy(x => x, new GemComparer()).ToList()
var cacheGems = gems.OrderBy(x => x, new GemComparer());
foreach (var thing in cacheGems)
{
Console.WriteLine(thing);
}
var previous = cacheGems.TakeWhile(x => x != input).LastOrDefault();
var next = cacheGems.SkipWhile(x => x != input).Skip(1).FirstOrDefault();
Console.WriteLine(previous);
Console.WriteLine(next);
將是空的,如果沒有找到
A11 A12 F10 F12 K14 K15 T16 T7 T9'
輸出:前面:A11,接下來F10
public class GemComparer : IComparer<string>
{
public int Compare(string s1, string s2)
{
if (IsNumeric(s1) && IsNumeric(s2))
{
if (Convert.ToInt32(s1) > Convert.ToInt32(s2)) return 1;
if (Convert.ToInt32(s1) < Convert.ToInt32(s2)) return -1;
if (Convert.ToInt32(s1) == Convert.ToInt32(s2)) return 0;
}
if (IsNumeric(s1) && !IsNumeric(s2))
return -1;
if (!IsNumeric(s1) && IsNumeric(s2))
return 1;
return string.Compare(s1, s2, true);
}
public static bool IsNumeric(object value)
{
try
{
int i;
return int.TryParse(value.ToString(), out i);
}
catch (FormatException)
{
return false;
}
}
}
的最好的事情,如果可能的話,將是你的數據庫改變將字母和數字分隔爲單獨的列。 – juharr
Thx Juharr,但我不能這樣做。 – Maro
在調用性能不佳之前,您是否測試過它?如果沒有,我建議你這樣做。 –