2011-11-11 44 views
9

Tôi đã tự hỏi nếu tôi có thể so sánh kích thước của nhiều danh sách một cách thanh lịch và nhanh chóng.So sánh kích thước (Đếm) của nhiều danh sách

Về cơ bản đây là vấn đề của tôi, tôi cần khẳng định rằng 6 danh sách có cùng kích thước. Vì vậy, cách thông thường là một cái gì đó như (cảnh báo mã xấu xí ..):

if (list1.Count == list2.Count && list1.Count == list3.Count && .....) { 
    //ok, so here they have same size. 
} 

Một số lựa chọn thay thế ở đây?

Trả lời

2

Làm thế nào về với LINQ:

bool allSameSize = new[] { list1, list2, list3, list4, list5, list6 } 
         .Select(list => list.Count) 
         .Distinct() 
         .Take(2) // Optimization, not strictly necessary 
         .Count() == 1; 

Ý tưởng này làm việc cho bất kỳ loại chuỗi (không chỉ là danh sách), và sẽ nhanh chóng loại bỏ càng sớm càng hai tội danh khác nhau được tìm thấy.

Lưu ý khác, có bất kỳ lý do gì khiến danh sách không thuộc bộ sưu tập "danh sách danh sách" không?

+0

thay vì 'Take (2) Count() == 1' tôi thích '.Skip (1) .A ny() 'thành ngữ – sehe

7

Sử dụng Enumerable.All bạn có thể kiểm tra xem tất cả danh sách phù hợp với tiêu chuẩn như nhau:

var allLists = new[] { list1, list2, list3 }; 
bool result = allLists.All(l => l.Count == allLists[0].Count); 

Hoặc như một lớp lót, nhưng bạn sẽ sau đó cần tham khảo danh sách cụ thể:

bool result = (new[] { list1, list2, list3 }).All(l => l.Count == list1.Count); 
1
var lists = new [] { list1, list2, list3 ... }; 

bool diffLengths = lists.Select(list => list.Count).Distinct().Skip(1).Any(); 

Hoặc

bool sameLen = new HashSet<int>(lists.Select(list => list.Count)).Count <= 1; 
2

Nếu bạn thực hiện loại so sánh với chỉ một nơi, sau đó nó có lẽ là không đáng cố gắng để làm cho nó ngắn hơn (đặc biệt là nếu nó tác động đến hiệu suất).

Tuy nhiên, nếu bạn so sánh độ dài danh sách tại hơn một nơi, nó có lẽ là đáng giá đặt nó trong một chức năng sau đó tái sử dụng nó nhiều lần:

static bool SameLength<T>(params IList<T>[] lists) { 
    int len = -1; 
    foreach (var list in lists) { 
     int list_len = list.Count; 
     if (len >= 0 && len != list_len) 
      return false; 
     len = list_len; 
    } 
    return true; 
} 

static void Main(string[] args) { 

    // All of these lists have same length (2): 
    var list1 = new List<int> { 1, 2 }; 
    var list2 = new List<int> { 3, 4 }; 
    var list3 = new List<int> { 5, 6 }; 
    var list4 = new List<int> { 7, 8 }; 
    var list5 = new List<int> { 9, 10 }; 
    var list6 = new List<int> { 11, 12 }; 

    if (SameLength(list1, list2, list3, list4, list5, list6)) { 
     // Executed. 
    } 

    // But this one is different (length 3): 
    var list7 = new List<int> { 11, 22, 33 }; 

    if (SameLength(list1, list2, list3, list7, list4, list5, list6)) { 
     // Not executed. 
    } 

} 

--- EDIT ---

Dựa trên Dean Barnes' idea, bạn thậm chí có thể làm điều này để thực hiện thêm ngắn:

static bool SameLength<T>(params IList<T>[] lists) { 
    return lists.All(list => list.Count == lists[0].Count); 
} 
Các vấn đề liên quan