林克加入问题

本文关键字:问题 林克 | 更新日期: 2023-09-27 17:59:21

具有以下内容:

class Hal
{
    public int zip { get; set; }
    public string Phone { get; set; }
    ...
}
List<Hal> data;
Dictionary<int, List<int>> zipList;

zipList-关键是"zip"-值是相关的"zip"的集合

想要从ziplist"key"中选择所有带有"zip"的"Hal"对象,并从zipli斯特"value"中选择与"zip"相关的所有"zip"对象。

我到底是怎么在c#linq中做到这一点的?

林克加入问题

那么你指的是data中的每个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.SelectMany(x => x)只会创建所有值的平面视图
  • 它与字典中的关键字连接在一起
  • 我正在从中创建一个HashSet<int>,以便在一瞬间简单高效地检查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中键入的,并且未经测试!

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