为了账号安全,请及时绑定邮箱和手机立即绑定

Linq 如何将 uniqe 元素从 List 添加到 ObservableCollection

Linq 如何将 uniqe 元素从 List 添加到 ObservableCollection

C#
噜噜哒 2021-11-21 16:38:37
我有一个关于检查一个列表中的对象是否存在于另一个列表中的问题,如果不存在,则全部通过 Linq 将它们添加到第二个列表中。实际上我有两个循环,一个条件: foreach (var p in seznamVlaku.Select(s => s.ProjizdejiciStanicemi)) {            foreach (var l in p) {                if(_nodes.Any(a => a.ID != l.Key.ID)){                    _nodes.Add(new Node() {Name = l.Key.Jmeno, ID = l.Key.ID, X = l.Key.X, Y = l.Key.Y });                }            }        }可以通过 Linq 查询更快地做到这一点吗?
查看完整描述

3 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

以下代码应该快得多,因为它使用散列而不是嵌套循环:


// build a HashSet of your key's type (I'm assuming integers here) containing all your current elements' keys in the _nodes ObservableCollection

HashSet<int> hashSet = new HashSet<int>(_nodes.Select(n => n.ID));


foreach (var l in seznamVlaku.SelectMany(s => s.ProjizdejiciStanicemi)) {

    // if you can add the element's ID to the HashSet it hasn't been added before

    if(hashSet.Add(l.Key.ID)) {

        _nodes.Add(new Node() {Name = l.Key.Jmeno, ID = l.Key.ID, X = l.Key.X, Y = l.Key.Y });

    }

}


查看完整回答
反对 回复 2021-11-21
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

我不认为这是一个很大更快的方式,你必须检查是否l已经存在_nodes,而且每个l。如果你能在更高的层次上优化它,我不知道这是在做什么。


如果你只是想要一个更短的 LINQ 语句,你可以使用SelectMany:


foreach(var l in sznamVlaku.SelectMany(s => s.ProjizdejiciStanicemi)

                           .Where(x => _nodes.All(a => a.ID != x.Key.ID)))

    _nodes.Add(new Node() {Name = l.Key.Jmeno, ID = l.Key.ID, X = l.Key.X, Y = l.Key.Y });

请注意,我用All的不是Any,因为你想找到的所有l地方的所有节点都有一个不同的ID。


查看完整回答
反对 回复 2021-11-21
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

你不需要两个foreach。而是使用 SelectMany。

你的例子:


foreach (var p in seznamVlaku.Select(s => s.ProjizdejiciStanicemi))

{

    foreach (var l in p)

    {

    }

}

我们可以这样写,结果是一样的:


foreach (var node in seznamVlaku.SelectMany(list => list.ProjizdejiciStanicemi))

{

}

您可以将条件(现有项目)添加到 linq 查询的管道中

代码:


foreach (var node in seznamVlaku

    .SelectMany(list => list.ProjizdejiciStanicemi)

    .Where(item => nodes

        .Exists(node => node.ID != item.ID)))

{

    _nodes.Add(new Node() {Name = node.Key.Jmeno, ID = node.Key.ID, X = node.Key.X, Y = node.Key.Y });

}


查看完整回答
反对 回复 2021-11-21
  • 3 回答
  • 0 关注
  • 163 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信