2012-09-11 26 views

Trả lời

49

Nếu bạn không quan tâm đến hiệu suất, bạn có thể thử:

a.Any(item => b.Contains(item)) 
// or, as in the column using a method group 
a.Any(b.Contains) 

Nhưng tôi sẽ cố gắng này đầu tiên:

a.Intersect(b).Any() 
+0

trình như một say mê. Vì bạn là người trả lời đầu tiên nên tôi đã đánh dấu bạn là câu trả lời. Cảm ơn. – wahaha

+0

Bạn không thể sử dụng 'a' cả dưới dạng danh sách và trong lambda. 'a.Any (a => b.Contains (a))'. Tôi sẽ đề nghị sử dụng một nhóm phương pháp thay vì 'a.Any (b.Contains)' – radbyx

9

Bạn có thể Intersect hai danh sách:

if (A.Intersect(B).Any()) 
11

Tôi đã mô tả hai giải pháp Justins. a.Any(a => b.Contains(a)) là nhanh nhất.

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace AnswersOnSO 
{ 
    public class Class1 
    { 
     public static void Main(string []args) 
     { 
//   How to check if list A contains any value from list B? 
//   e.g. something like A.contains(a=>a.id = B.id)? 
      List<int> a = new List<int> {1,2,3,4}; 
      List<int> b = new List<int> {2,5}; 
      int times = 10000000; 

      DateTime dtAny = DateTime.Now; 
      for (int i = 0; i < times; i++) 
      { 
       var aContainsBElements = a.Any(b.Contains); 
      } 
      var time = (DateTime.Now - dtAny).TotalSeconds; 

      DateTime dt2 = DateTime.Now; 
      for (int i = 0; i < times; i++) 
      { 
       var aContainsBElements = a.Intersect(b).Any(); 
      } 
      var time2 = (DateTime.Now - dt2).TotalSeconds; 

      // time1: 1.1470656 secs 
      // time2: 3.1431798 sec 
     } 
    } 
} 
0

Tôi viết phương pháp nhanh hơn để có thể đặt phương thức nhỏ. Nhưng tôi thử nghiệm nó trong một số dữ liệu mà một số thời gian đó là nhanh hơn mà Intersect nhưng một số thời gian Intersect nhanh rằng mã của tôi.

public static bool Contain<T>(List<T> a, List<T> b) 
    { 
     if (a.Count <= 10 && b.Count <= 10) 
     { 
      return a.Any(b.Contains); 
     } 

     if (a.Count > b.Count) 
     { 
      return Contain((IEnumerable<T>) b, (IEnumerable<T>) a); 
     } 
     return Contain((IEnumerable<T>) a, (IEnumerable<T>) b); 
    } 

    public static bool Contain<T>(IEnumerable<T> a, IEnumerable<T> b) 
    { 
     HashSet<T> j = new HashSet<T>(a); 
     return b.Any(j.Contains); 
    } 

Gọi Intersect Set chưa kiểm tra kích thước thứ hai và đây là mã của Intersect.

 Set<TSource> set = new Set<TSource>(comparer); 
     foreach (TSource element in second) set.Add(element); 
     foreach (TSource element in first) 
      if (set.Remove(element)) yield return element; 

Sự khác biệt trong hai phương pháp là phương pháp của tôi sử dụng HashSet và kiểm tra số lượng và Intersect sử dụng set đó là nhanh hơn so với HashSet. Chúng tôi không cảnh báo hiệu quả của nó.

Các thử nghiệm:

static void Main(string[] args) 
    { 
     var a = Enumerable.Range(0, 100000); 
     var b = Enumerable.Range(10000000, 1000); 
     var t = new Stopwatch(); 
     t.Start(); 
     Repeat(()=> { Contain(a, b); }); 
     t.Stop(); 
     Console.WriteLine(t.ElapsedMilliseconds);//490ms 

     var a1 = Enumerable.Range(0, 100000).ToList(); 
     var a2 = b.ToList(); 
     t.Restart(); 
     Repeat(()=> { Contain(a1, a2); }); 
     t.Stop(); 

     Console.WriteLine(t.ElapsedMilliseconds);//203ms 

     t.Restart(); 
     Repeat(()=>{ a.Intersect(b).Any(); }); 
     t.Stop(); 
     Console.WriteLine(t.ElapsedMilliseconds);//190ms 

     t.Restart(); 
     Repeat(()=>{ b.Intersect(a).Any(); }); 
     t.Stop(); 
     Console.WriteLine(t.ElapsedMilliseconds);//497ms 

     t.Restart(); 
     a.Any(b.Contains); 
     t.Stop(); 
     Console.WriteLine(t.ElapsedMilliseconds);//600ms 

    } 

    private static void Repeat(Action a) 
    { 
     for (int i = 0; i < 100; i++) 
     { 
      a(); 
     } 
    } 
0

Tôi sử dụng này để đếm:

 int cnt = 0; 

     foreach (var lA in listA) 
     { 
      if (listB.Contains(lA)) 
      { 
       cnt++; 
      } 
     } 
+0

Một số không được yêu cầu. Đây là mã không bắt buộc, rất hiệu quả. –

+0

Giải thích thêm một chút có thể là để trả lời câu trả lời này, chẳng hạn như lý do bạn chọn sử dụng số thay vì giá trị boolean. Điều này * không * nhận được công việc làm mặc dù. – Taegost

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