繁体   English   中英

使用Linq从集合中获取对象

[英]Get objects from collection with Linq

我在C#中有一个具有一些属性的对象:

// Pseudo class
public class
{
    Id;
    To;
    From;
}

我在Collection中有该类的很多实例。 可能看起来像这样:

object 1:
  Id: 1
  To: "PathA"
  From: "PathB"

object 2:
  Id: 2
  To: "PathB"
  From: "PathC"

object 3:
  Id: 3
  To: "PathC"
  From: "PathA"

现在,我要做的是从该集合中获取所有项目,其中To的值未出现在任何对象的From中。 这将导致以下结果:

object 1:
  Id: 1
  To: "PathA"
  From: "PathB"

object 2:
  Id: 2
  To: "PathB"
  From: "PathC"

因为最后一个具有Id: 3对象在From属性中具有PathA ,而该属性已经存在于To属性中。

如何用Linq查询做到这一点?

那么,如何解决这个问题? 首先,您可以创建To的所有值的索引。 然后,根据From属性过滤序列...

就像是:

var tos = new HashSet<string>(collection.Select(item => item.To));
var filtered = collection.Where(item => !tos.Contains(item.From));

您可能想要检查,是否创建HashSet确实可以像这样工作,或者是否需要以其他方式构造它……但是您明白了。 如果tos太长,集合是有效的,因为您将对此进行很多检查...

说您的对象集合如下:

var objects = { object1, object2, object3 }

然后,您想要:

var result = objects.Where(o => !objects.Select(x => x.From).Contains(o.To));

如果涉及大型数据集,则缓存和存储“发件人”路径的子选择可能很聪明:

var fromPaths = new HashSet<string>(objects.Select(x => x.From));
var result = objects.Where(o => !fromPaths.Contains(o.To))

首先,由于所有样本对象的To与其他From对应,因此您的样本与问题文本实际上并不匹配。 但是,假设问题文本是正确的,而样本是错误的:

如何进行组联接

var query = from obj in collection
            join fromObj in collection
                 on obj.To equals fromObj.From
                 into objGroup
            where !objGroup.Any()
            select obj;

或者,首先构建一组不同的Froms:

var distinctFroms = new HashSet<string>(collection.Select(item => item.From));

var query = from obj in collection
            where !distinctFroms.Contains(obj.To)
            select obj;
var list = collection.Select(c=>c.To).Distinct().ToList();
var result = collection.Where(c=>!list.Contains(c.From)).ToList();

如果使用“到”和“从”作为各自的键将集合重新加入自身,则可以通过“到/从”确定哪些项目被“连接”,并排除它们:

var itemsThatAreConnected = 
    collection.Join(collection, x => x.To, x => x.From, (a,b) => a);
var unconnected = collection.Except(itemsThatAreConnected);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM