我有两个List<Guid>()
,我希望在第二个列表中找到不的GUID
值。
如何使用LINQ
执行此操作?我认为LINQ
比foreach()
更有效。
答案 0 :(得分:4)
为此,您可以使用LINQ Except()
扩展方法:
var result = list1.Except(list2);
答案 1 :(得分:1)
我做了一个测试,比较了不同方法完成这项任务需要多长时间。
对于测试,我使用了2 List<Guid>
个200项
第二个列表包含~1 / 10个伪随机元素,它们也在第一个中。
我使用StopWatch()
由于
Except
,Where
和LookUp
已缓存,因此测试已经完成 每次重启。然而,知道缓存可能是有用的 初始化后,函数只需要几个Tick
(1~7)即可完成。
如果 相同的查询必须重复多次,这些函数' 功能可以真正发挥作用。
这就是创建两个列表的方式:
Random _random = new Random(DateTime.UtcNow.Millisecond);
_random.Next(0, 10);
List<Guid> _Guid1 = new List<Guid>(200);
List<Guid> _Guid2 = new List<Guid>(200);
int InsertPoint = _random.Next(0, 10);
for (int x = 0; x < 200; x++)
{
_Guid1.Add(Guid.NewGuid());
_Guid2.Add((x == InsertPoint) ? _Guid1.Last() : Guid.NewGuid());
if (x > 9 && ((x % 10F) == 0.0F))
InsertPoint = _random.Next(x, x + 10);
}
这些是测试的功能:
List1 Except
List2
var result1 = _Guid1.Except(_Guid2);
List1.Item Where
!= List2.Item
var result2 = _Guid1.Where(guid1 => _Guid2.All(guid2 => guid2 != guid1));
List1.Items FindAll
!= List2.Items
var result3 = _Guid1.FindAll(guid1 => _Guid2.All(guid2 => guid2 != guid1));
List1.Item LookUp Contains
(List2.Item)
var LookUpresult = _Guid1.ToLookup(guid1 => _Guid2.Contains(guid1));
var result4 = LookUpresult[false].ToList();
List1 Hashset GroupBy Contains
(List2 Hashset
)
var GuidHS1 = new HashSet<Guid>(_Guid1);
var GuidHS2 = new HashSet<Guid>(_Guid2);
var HSGroups = _Guid1.GroupBy(guid => GuidHS2.Contains(guid));
var result5 = HSGroups.First().ToList();
ForEach
列表1 - &gt;项目ForEach
列表2 - &gt;项目(项目1 ==项目2)=&gt;项目list3
List<Guid> _Guid3 = new List<Guid>();
bool _Found;
foreach (Guid _guidtest in _Guid1) {
_Found = false;
foreach (Guid _guidcompare in _Guid2) {
if (_guidtest == _guidcompare) {
_Found = true;
break;
}
}
if (_Found == false) _Guid3.Add(_guidtest);
}
这是这次测试的结果:(20轮)
Number of equal elements found: 181~184
EXCEPT => Time: 1724 ~ 4356 ticks
WHERE => Time: 3651 ~ 7360 ticks
FINDALL => Time: 3037 ~ 6472 ticks
LOOKUP => Time: 9406 ~ 16502 ticks
HASHSET GROUPBY => Time: 1773 ~ 3597 ticks
FOREACH => Time: 650 ~ 1529 ticks