2010-06-10 35 views
5
IEnumerable<String> existedThings = 
     from mdinfo in mdInfoTotal select mdinfo.ItemNo; 

IEnumerable<String> thingsToSave = 
     from item in lbXReadSuccess.Items.Cast<ListItem>() select item.Value; 

Dưới đây là hai IEnumerable.kiểm tra tính tồn tại giữa hai IEnumerable

Tôi muốn kiểm tra xem có tồn tại value in existedThings trong thingsToSave hay không.

O.K. Tôi có thể làm điều đó với 3 dòng mã.

bool hasItemNo; 
foreach(string itemNo in existedThings) 
    hasItemNo= thingsToSave.Contains(itemNo); 

Nhưng, có vẻ bẩn.

Tôi chỉ muốn biết liệu có giải pháp tốt hơn hay không.

+0

Xin lỗi về tiếng Anh nghèo nàn của tôi! –

+2

Đừng lo lắng về điều đó, tôi đã thấy tồi tệ hơn nhiều so với những người nói tiếng Anh bản địa. Bạn đang làm tốt! –

Trả lời

8
int[] id1 = { 44, 26, 92, 30, 71, 38 }; 
int[] id2 = { 39, 59, 83, 47, 26, 4, 30 }; 

IEnumerable<int> both = id1.Intersect(id2); 

foreach (int id in both) 
    Console.WriteLine(id); 

//Console.WriteLine((both.Count() > 0).ToString()); 
Console.WriteLine(both.Any().ToString()); 

Look cho Enumerable.Intersect Method

+6

Sử dụng .Any() thay vì .Count()> 0 để tránh lặp lại không cần thiết. –

+0

Cảm ơn vì điều đó! – VMAtm

4

Bạn có thể sử dụng Intersect để đạt được điều này:

// puts all items that exists in both lists into the inBoth sequence 
IEnumerable<string> inBoth = existedThings.Intersect(thingsToSave); 
4
bool hasItemNo = existedThings.Intersect(thingsToSave).Count() > 0; 

Bạn thậm chí có thể cung cấp Comparer của riêng bạn nếu bạn cần phải: Enumerable.Intersect

3

Nó bẩn và nó cũng sẽ không hoạt động! hasItemNo của bạn sẽ chỉ là true nếu giá trị mới nhất trong existedThings là trong thingsToSave.

Vì bạn gắn thẻ này với "LINQ" Mặc dù vậy, tôi đoán mã này sẽ làm việc cho bạn:

bool hasItemNo = thingsToSave.Intersect(existedThings).Count() > 0 
+0

Tốt bắt trên phân công boolean! +1 – Lazarus

2

Không hoàn toàn rõ ràng về những gì bạn thực sự muốn ở đây nhưng đây là một gợi ý cho chỉ lấy các chuỗi tồn tại trong thingstoSave và existedThings.

IEnumerable<String> existedThings = 
     from mdinfo in mdInfoTotal select mdinfo.ItemNo; 

IEnumerable<String> thingsToSave = 
     from item in lbXReadSuccess.Items.Cast<ListItem>() 
     where existedThings.Contains(item.Value) 
     select item.Value; 
8

Những câu trả lời upvoted đề xuất một thuật toán mà sẽ có O (n^2) phức tạp nếu IEnumerable đã không bắt nguồn từ một lớp mà thực hiện ICollection <>. Một truy vấn LINQ chẳng hạn. Phương thức mở rộng Count() sau đó phải lặp lại tất cả các phần tử để đếm chúng. Đó không phải là mát mẻ. Bạn chỉ cần phải kiểm tra nếu kết quả có chứa bất kỳ yếu tố:

bool hasItemNo = existedThings.Intersect(thingsToSave).Any(); 

Trình tự các vấn đề btw, làm cho liệt kê mà bạn mong đợi để có số nhỏ nhất của vật lý luận của Intersect().

+0

+1 để chỉ ra thứ tự mà bạn sử dụng các bộ sưu tập. – rsgoheen

Các vấn đề liên quan