Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将两个列表转换为字典_C#_Linq - Fatal编程技术网

C# 将两个列表转换为字典

C# 将两个列表转换为字典,c#,linq,C#,Linq,我正在寻找一个LINQ函数,它可以替代我这里的两个循环,从而产生类似的结果: public class Outer { public long Id { get; set; } } public class Inner { public long Id { get; set; } public long OuterId { get; set; } } var outers = new List<Outer>(); var inners = new List

我正在寻找一个LINQ函数,它可以替代我这里的两个循环,从而产生类似的结果:

public class Outer {
    public long Id { get; set; }
}

public class Inner {
    public long Id { get; set; }
    public long OuterId { get; set; }
}

var outers = new List<Outer>();
var inners = new List<Inner>();
// add some of each object type to the two lists

// I'd like to replace this code with a LINQ-style approach
var map = new Dictionary<long, long>();
foreach (Outer outer in outers) {
    foreach (Inner inner in inners.Where(m => m.OuterId == outer.Id)) {
        map.Add(inner.Id, outer.Id);
    }
}
公共类外部{
公共长Id{get;set;}
}
公共阶级内部{
公共长Id{get;set;}
公共长OuterId{get;set;}
}
var outers=新列表();
var inners=新列表();
//将每种对象类型中的一些添加到两个列表中
//我想用LINQ风格的方法替换这段代码
var map=newdictionary();
foreach(外部在外部){
foreach(inners.Where(m=>m.OuterId==outer.Id)中的内部){
map.Add(inner.Id,outer.Id);
}
}

签出Enumerable.Join和Enumerable.ToDictionary。

以下应该可以工作(现在编写测试用例):

var map = inners
          .ToDictionary(a => a.Id, 
                        a => outers
                             .Where(b => b.Id == a.OuterId)
                             .Select(b => b.Id)
                             .First()
                        );
var dict=(用于外部输入-外部
内接内接内接
在外部.Id等于内部.OuterId
选择new KeyValuePair(inner.Id,outer.Id)).ToDictionary(k=>k.Key,v=>v.Value);

看起来您的示例代码可能不符合您的要求……无论发生什么情况,内部的.Id都是唯一的。每个内在只能属于一个外在。我已经让它正常工作了,但我只是在寻找一个更优雅的解决方案。它真的值得吗?看起来您不需要延迟执行或任何其他linq特定功能。@Adamlevit您的解决方案对我来说很优雅,并且更易于调试(在您用linq语句替换
if
语句之前)。您是指导致
字典的
类型的映射吗?我想我可以在末尾加一个
select
。但这不值得否决。不,我指的是比较
b.OuterId
(a
long
)和
a
Outer
)。你是说
b.OuterId==a.Id
?谢谢。编辑了我的答案。这个答案实际上是向后的,我在代码中手动修复了它,但在每个KVP的值部分,我得到的是完整的外部对象,而不是它的Id。@adamlevit根据您的评论编辑了我的答案。希望这是一个进步。
var map = inners.Join(outers, x => x.OuterId, x => x.Id, (inner, outter) => new
    {
        InnerId = inner.Id,
        OuterId = outter.Id
    }).ToDictionary(x => x.InnerId, x => x.OuterId);
var dict = (for outer in outers
            join inner in inners
            on outer.Id equals inner.OuterId
            select new KeyValuePair<long,long>(inner.Id, outer.Id)).ToDictionary(k => k.Key, v => v.Value);