23
A
回答
49
如果你不關心性能,你可以嘗試:
a.Any(item => b.Contains(item))
// or, as in the column using a method group
a.Any(b.Contains)
但我想先試試這個:
a.Intersect(b).Any()
9
可以Intersect
兩個列表:
if (A.Intersect(B).Any())
11
我介紹了賈斯汀的兩個解決方案。 a.Any(a => b.Contains(a))
最快的是。
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
我寫了一個更快的方法,它可以使小的設置。但是我在一些數據中測試它,一段時間以後相交會更快,但有一段時間與我的代碼快速交叉。
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);
}
相交調用Set
尚未檢查第二尺寸,這是相交的代碼。
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;
兩種方法的區別是我的方法使用HashSet
,檢查計數和Intersect
使用set
比HashSet
更快。我們不會對它的表現發火。
測試:
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
我用這個來算:
int cnt = 0;
foreach (var lA in listA)
{
if (listB.Contains(lA))
{
cnt++;
}
}
+0
不要求計數。這是非常低效的命令式代碼。 –
+0
有一點更多的解釋可能是爲了這個答案,比如爲什麼你選擇使用計數而不是布爾值。這*確實*完成了工作。 – Taegost
相關問題
- 1. 查找列A中的值是否包含列B中的值?
- 2. 列A包含B列
- 3. 如何查看SQL中每列(b)有多少個列(a)值
- 4. 表A的列a到表B的列b的SQL拷貝值
- 5. 有2個表格,A(列a)和B(列b)。我想查找表A列a列中每個值的出現次數b列表b
- 6. 如何檢查列表A是否使用VB.net列表B中的子列表?
- 7. clojure中的a..b列表
- 8. 如果表A的列A等於表B的列B,則從兩個表(表A和表B)獲得輸出
- 9. Excel - 一系列單元格是否包含列表中的值?從列表中包含的任何值: -
- 10. 從列表中檢索列表B A
- 11. Excel VBA - 如果列B包含任何值,則更新列A的值。如果列B不包含值,則不要運行宏
- 12. SQL查詢:獲取表A中列A =表B中列A的行
- 13. 如何查看列表是否包含Python中的另一個列表?
- 14. 檢查列表<t>包含任何其他列表
- 15. 在Excel電子表格中包含兩列A和B如何從列中刪除重複的條目。 B'
- 16. PostgreSQL如果表A不包含值,則插入到表A和表B中
- 17. 如何拆分列表[要麼[A,B]]
- 18. 如何解決包含列表的列表中的值?
- 19. 如何檢查下拉列表中包含jquery中的任何值
- 20. 列表中包含的列表檢查
- 21. 給定一個(A * B)列表,返回(A * B列表)名單
- 22. SqlAlchemy如何查詢列A == a和B == b和A == b和B == a
- 23. 如何判斷列表B中是否包含具有離散數量的重複元素的列表A?
- 24. 如何檢索包含B外鍵的模型A的模型列表?
- 25. 其中列表中包含任何列表
- 26. 在SQLite中,如何使用表B中列的值更新TABLE A中的列?
- 27. 如何合併包含在R A值列表
- 28. 如何獲得包含任何NA字段的列的列表?
- 29. 如何查詢如果列表包含
- 30. 如何查找散列表a中是否存在hashmap b
就像一個魅力。由於您是第一位答辯人,所以我將您標記爲答案。謝謝。 – wahaha
你不能在列表和lambda中使用'a'。 'a。任何(a => b.Contains(a))''。我建議使用方法組而不是'a.Any(b.Contains)' – radbyx