2013-07-16 1 views
0

다음과 같이 문자열 목록을 비교하는 코드가 있습니다. 이제는 그 코드를 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); 
     } 
    } 

위의 코드

은 나에게 오류를 제공합니다. 이유 존재는, 나는

+6

왜 문자열에서만 작동하는 제네릭 버전을 원하십니까? –

+0

문자열에서만 정확하게 작동하지 않는 ToString()을 사용하여 객체를 비교합니다. – C4stor

+0

generic 형식은 'T'가 실제로 무엇인지는 중요하지 않을 때 사용됩니다. 클래스에 관한 한 그것의 사용은 실제로 * generic *이 될 것이다. .NET에서 제네릭 형식을 사용하고 있고 값과 관련이 있다고 생각하면 적절하게 구문을 사용하고 있다는 좋은 신호입니다. – Yuck

답변

1

Regex.Split()string[] 반환 T.에 문자열 기능을 사용할 수 없습니다,하지만 당신은 일반 매개 변수 유형 T으로 strFirststrSecond을 정의했습니다. 대신 다음을 시도하십시오 :

private Dictionary<T, string[]> Value; 

public BaseComparer() 
{ 
    Value = new Dictionary<T, string[]>(); 
} 

string[] 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); 
} 
+1

더 이상'T []'하지만'string []'을 저장하지 않으므로'Dictionary Value'를 업데이트해야합니다. –

+0

@ChrisSinclair 네 말이 맞아, 내가 그걸 갱신 할거야. 이것은 또한 일반적인 유형인지 여부에 대한 동일한 질문으로 이어집니다. IMO 아마 안됩니다. – Yuck

+0

아마도 그렇지 않습니다. 이 시점에서'객체 '를 취할 수도 있습니다. (일반적으로는 값 유형의 복싱을 피할 수는 있지만 어떻게 든이 방법에서 성능의 병목 현상이 될 것이라는 점은 의심 스럽습니다.) 비교는 비 - 정적 클래스의 generic이지만, 아직도 IComparer 을 구현하고 있다면'BaseComparer '레벨에서 generic이어야하고'object'로 형변환되고 비 제네릭 정적 도우미 메소드로 전달됩니다. –