을 나는 모든 보석을 채우는 간단한 캐시와 비교자를 사용하는 순서를 사용하는 접근법을 제안 할 것이다. 발견되지 않는 경우는
// 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;
}
}
}
가장 좋은 것은, 가능하다면, 귀하의 DB를 변경하는 것 문자와 숫자를 별도의 열로 구분하십시오. – juharr
Thx juharr,하지만 그렇게 할 수는 없습니다. – Maro
나쁜 성능이라고하기 전에 테스트 해 보셨습니까? 그렇지 않다면, 당신이하는 것이 좋습니다. –