林克加入问题
本文关键字:问题 林克 | 更新日期: 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
);