拥有以下内容:
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中执行此操作?
答案 0 :(得分:4)
你的意思是Hal
中data
的每一个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
);