我会建议使用一个简单的缓存来填充所有的宝石和他们使用比较器的顺序。
// 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
在调用性能不佳之前,您是否测试过它?如果没有,我建议你这样做。 –