从列表中查找不在C#中的另一个列表中的ID

时间:2018-03-21 00:01:33

标签: c#

我有两个List<Guid>(),我希望在第二个列表中找到GUID值。

如何使用LINQ执行此操作?我认为LINQforeach()更有效。

2 个答案:

答案 0 :(得分:4)

为此,您可以使用LINQ Except()扩展方法:

var result = list1.Except(list2);

答案 1 :(得分:1)

我做了一个测试,比较了不同方法完成这项任务需要多长时间。

对于测试,我使用了2 List<Guid>个200项 第二个列表包含~1 / 10个伪随机元素,它们也在第一个中。

我使用StopWatch()

测量了完成每个方法所需的时间
  

由于ExceptWhereLookUp已缓存,因此测试已经完成   每次重启。然而,知道缓存可能是有用的   初始化后,函数只需要几个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