C# Linq连接问题

C# Linq连接问题,c#,.net,linq,C#,.net,Linq,具备以下条件: class Hal { public int zip { get; set; } public string Phone { get; set; } ... } List<Hal> data; Dictionary<int, List<int>> zipList; 拉链 -钥匙是拉链 -值是相关zip文件的集合 要选择所有具有zip from ziplist键和所有相关zip from ziplist值的Hal对象

具备以下条件:

class Hal
{
    public int zip { get; set; }
    public string Phone { get; set; }
    ...
}

List<Hal> data;
Dictionary<int, List<int>> zipList;
拉链 -钥匙是拉链 -值是相关zip文件的集合

要选择所有具有zip from ziplist键和所有相关zip from ziplist值的Hal对象

在c linq中我到底该怎么做呢?

那么你指的是数据中的每个Hal,zip要么在键中,要么在zipList的值中?我可能会使用:

data.Join(
    zipList,
    hal => hal.zip,
    zlKvp => zlKvp.Key,
    (hal, zlKvp) => new {hal,zlKvp} //hal and KeyValuePair from zipList
);
var zips = new HashSet<int>(zipList.Keys
                                   .Concat(zipList.Values.SelectMany(x => x));
var hals = data.Where(x => zips.Contains(x.zip));
解释:

zipList.Values.SelectManyx=>x将创建所有值的展开视图 它与字典中的键连接在一起 我正在从中创建一个HashSet,以便在一瞬间简单高效地签入Where子句;或者加入也可以帮我们做到这一点,但当我们只对其中一方感兴趣时,不加入感觉更简单 Where子句只是将Hal对象列表过滤为具有所需zip的对象 那么你是指数据中的每个Hal,zip要么在键中,要么在zipList的值中?我可能会使用:

var zips = new HashSet<int>(zipList.Keys
                                   .Concat(zipList.Values.SelectMany(x => x));
var hals = data.Where(x => zips.Contains(x.zip));
解释:

zipList.Values.SelectManyx=>x将创建所有值的展开视图 它与字典中的键连接在一起 我正在从中创建一个HashSet,以便在一瞬间简单高效地签入Where子句;或者加入也可以帮我们做到这一点,但当我们只对其中一方感兴趣时,不加入感觉更简单 Where子句只是将Hal对象列表过滤为具有所需zip的对象
我认为您需要一个包含在字典中zip的Hal列表,以及字典值中zip列表定义的相关Hal

var RelatedZips = from KeyValue in zipList
                  join halData in data on KeyValue.Key equals halData.zip
                  select new
                  {
                      ZipData = halData,
                      RelatedZipData = KeyValue.Value.Select(RelatedZipIndex =>
                          data.SingleOrDefault(d => d.zip == RelatedZipIndex))
                                    .Where(z => z != null)
                  };

注意:代码未在IDE中键入,且未经测试

我认为您需要字典中包含一个zip的Hal列表,以及字典值中zip列表定义的相关Hal

var RelatedZips = from KeyValue in zipList
                  join halData in data on KeyValue.Key equals halData.zip
                  select new
                  {
                      ZipData = halData,
                      RelatedZipData = KeyValue.Value.Select(RelatedZipIndex =>
                          data.SingleOrDefault(d => d.zip == RelatedZipIndex))
                                    .Where(z => z != null)
                  };

注意:代码未在IDE中键入,且未经测试

它没有/我的/邮政编码,是吗?哈,我们班让我说:对不起,戴夫。恐怕我不能那样做PIt没有/我的/邮政编码,是吗?哈,我们班让我说:对不起,戴夫。恐怕我不能那样做p该表达式应为您提供一个包含2个成员的匿名类型,ZipData是Hal,RelatedZipData是字典定义的相关Hal的列表。如果你想要一个Hal列表,那么我不明白你想要什么。这个表达式应该给你一个包含两个成员的匿名类型,ZipData,它是Hal,RelatedZipData,它是字典定义的相关Hal的列表。如果你想要一张哈尔的单子,那么我不明白你想要什么。