Linq加入问题

时间:2011-06-16 10:39:55

标签: c# .net linq

拥有以下内容:

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

List<Hal> data;
Dictionary<int, List<int>> zipList;

zipList - 关键是“拉链” - value是相关“zip”的集合

想要从ziplist“key”中选择带有“zip”的所有“Hal”对象,并从ziplist“value”中选择所有相关的“zip”。

我如何在c#linq中执行此操作?

3 个答案:

答案 0 :(得分:4)

你的意思是Haldata的每一个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.SelectMany(x => x)

解释:

  • HashSet<int>只会创建所有值的展平视图
  • 这与词典中的键连接起来
  • 我正在创建一个Where,以便在一瞬间检查Where子句的简单性和效率;或者,一个联盟会为我们这样做,但是当我们真的只对一方感兴趣时,加入会感觉更简单
  • Hal子句只会将zip个对象列表过滤为具有必需{{1}}
  • 的对象

答案 1 :(得分:1)

我想你想要一个包含在字典中的zip的Hal列表,其中相关的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中输入,未经测试!

答案 2 :(得分:0)

data.Join(
    zipList,
    hal => hal.zip,
    zlKvp => zlKvp.Key,
    (hal, zlKvp) => new {hal,zlKvp} //hal and KeyValuePair from zipList
);