2011-10-24 25 views
5

tôi muốn làm một cái gì đó như thế này:Tôi có thể sử dụng toán tử kết hợp trên các số nguyên trong chuỗi CompareTo không?

public override int CompareTo (Foo rhs) 
{ 
    return Bar.CompareTo(rhs.Bar) ?? 
      Baz.CompareTo(rhs.Baz) ?? 
      Fuz.CompareTo(rhs.Fuz) ?? 0; 
} 

này không hoạt động như bằng văn bản; có một số giải pháp tối thiểu để làm cho nó hoạt động không? Về cơ bản tôi muốn 0 chuỗi cho đến khi không khác (hoặc kết thúc chuỗi).

+0

Tôi không biết câu trả lời cho câu hỏi của bạn, nhưng nếu ba giá trị có thể được sử dụng để xác định giá trị trả về, bạn có thể muốn xem xét việc thiết kế lại lớp học của bạn. –

+0

@DJ 'CompareTo' liên quan đến phân loại; đó là khá phổ biến, thực sự - ví dụ, sắp xếp theo họ - nếu đó là như nhau, sau đó sắp xếp theo FirstName, sau đó nếu vẫn bằng nhau, sắp xếp theo một số định danh duy nhất (ví dụ như id cơ sở dữ liệu). –

+0

@Marc Thú vị, tôi chưa từng tiếp xúc với điều này trước đây. Tôi thấy rằng CompareTo là một phần của lớp IComparable. Tôi sẽ phải đọc nhiều hơn để có được một số quan điểm. Cảm ơn –

Trả lời

2

Không hỗ trợ bởi ngôn ngữ . Nhưng bạn có thể viết một người trợ giúp nhỏ như thế này:

public override int CompareTo (Foo rhs) 
{ 
    return FirstNonZeroValue(
     () => Bar.CompareTo(rhs.Bar), 
     () => Baz.CompareTo(rhs.Baz), 
     () => Fuz.CompareTo(rhs.Fuz)); 
} 

private int FirstNonZeroValue(params Func<int>[] comparisons) 
{ 
    return comparisons.Select(x => x()).FirstOrDefault(x => x != 0); 
} 
+0

Ugh. Các giải pháp như thế này minh họa mức độ hút mà chúng ta không thể có các chức năng toàn cầu. –

+0

Người ta luôn có thể đặt nó trong một chức năng mở rộng nếu sử dụng nhiều, vv – driis

+0

Một phần mở rộng về những gì? Int32? Điều đó thậm chí có thể? –

2

Không có cơ bản, nhưng nó sẽ là tốt đẹp nếu nó đã làm (IIRC, Jon đã đề cập một ý tưởng tương tự trong C# trong chiều sâu). Bạn có thể có thể chuỗi điều kiện, nhưng tôi có xu hướng chỉ cần sử dụng:

int delta = Bar.CompareTo(rhs.Bar); 
if(delta == 0) delta = Baz.CompareTo(rhs.Baz); 
if(delta == 0) delta = Fuz.CompareTo(rhs.Fuz); 
return delta; 
2

Không thực sự, ?? chỉ hoạt động cho các giá trị null (loại tài liệu tham khảo hoặc struct nullable)

int i; 

i = Bar.CompareTo(rhs.Bar); 
if (i != 0) return i; 

i = Baz.CompareTo(rhs.Baz); 
if (i != 0) return i; 

i = Fuz.CompareTo(rhs.Fuz); 
if (i != 0) return i; 

return 0; 
0

Nếu không cần mạch ngắn, bạn có thể thực hiện một số phép tính nhị phân. It is not required that the Compare results must be -1, 0, or 1, but that they must be < 0, = 0, > 0. Vì vậy, bằng cách sử dụng 2^n làm hệ số trong đó n là ưu tiên, bạn có thể tổng hợp kết quả CompareTo và nhận số> 0 hoặc < 0 nếu cần.

Vì vậy, sử dụng

return 4 * Bar.CompareTo(rhs.Bar) 
    + 2 * Baz.CompareTo(rhs.Baz) 
    + 1 * Fuz.CompareTo(rhs.Fuz); 
Các vấn đề liên quan