다음과 같이 문자열 목록을 비교하는 코드가 있습니다. 이제는 그 코드를 generic으로 변환하고 싶습니다. 동일한 코드를 generic으로 변환하려고했지만 많은 문제를 수정했지만 오류가 발생했습니다. 제가 제네릭을 처음 접했을 때 제가 잘못하고있는 것에 나를 인도하기 위해 전문가의 손이 필요합니다. 내가 정규식 줄에 교체 사용하려고하면 일반 문자열로 변환하려고 시도했습니다.
public class BaseComparer<T> : IComparer<T>, IDisposable where T : IBaseComparer<T>
{
private Dictionary<T, T[]> Value;
public BaseComparer()
{
Value = new Dictionary<T, T[]>();
}
public int Compare(T lhs, T rhs)
{
if (lhs.Equals(rhs))
return 0;
T[] strFirst, strSecond;
if (!Value.TryGetValue(lhs, out strFirst))
{
strFirst = Regex.Split(lhs.ToString().Replace(" ", ""), "([0-9]+)");
strFirst = Regex.Split(lhs.ToString().Replace("|", ">>"), "([0-9]+)");
Value.Add(lhs, strFirst);
}
if (!Value.TryGetValue(rhs, out strSecond))
{
strSecond = Regex.Split(rhs.ToString().Replace(" ", ""), "([0-9]+)");
strSecond = Regex.Split(rhs.ToString().Replace("|", ">>"), "([0-9]+)");
Value.Add(rhs, strSecond);
}
for (int i = 0; i < strFirst.Length && i < strSecond.Length; i++)
{
if (!strFirst[i].Equals(strSecond[i]))
{
return Splitcompare(strFirst[i], strSecond[i]);
}
}
if (strSecond.Length > strFirst.Length)
{
return 1;
}
else if (strFirst.Length > strSecond.Length)
{
return -1;
}
else
{
return 0;
}
}
private static int Splitcompare(string left, string right)
{
int x, y;
if (!int.TryParse(left.ToString(), out x))
{
return left.CompareTo(right);
}
if (!int.TryParse(right.ToString(), out y))
{
return left.CompareTo(right);
}
return x.CompareTo(y);
}
}
위의 코드
은 나에게 오류를 제공합니다. 이유 존재는, 나는
왜 문자열에서만 작동하는 제네릭 버전을 원하십니까? –
문자열에서만 정확하게 작동하지 않는 ToString()을 사용하여 객체를 비교합니다. – C4stor
generic 형식은 'T'가 실제로 무엇인지는 중요하지 않을 때 사용됩니다. 클래스에 관한 한 그것의 사용은 실제로 * generic *이 될 것이다. .NET에서 제네릭 형식을 사용하고 있고 값과 관련이 있다고 생각하면 적절하게 구문을 사용하고 있다는 좋은 신호입니다. – Yuck