我之前发过这个帖子,但我措辞不好。我正在尝试一个更深思熟虑的结构。
我有以下代码,我试图找出更短的linq表达式来做'内联'。请检查底部附近的“Run()”方法。我试图了解如何根据其中一个对象中的匹配标识符将两个字典连接在一起 - 这样我就可以使用这种语法中的查询。
var selected = from a in items.List()
// etc. etc.
select a;
这样我就可以在代码中定义我的结构......
TModelViewModel = new TModelViewModel
{
TDictionary = from a in items... etc. etc...
}
而不是经历一堆foreach循环,额外的对象声明等等。
这是我的班级结构。我正试图简化Run()方法。我基本上需要在几个地方进行内联转换,我想简化它,以便我可以更“干净”地定义它。
class TModel
{
public Guid Id { get; set; }
}
class TModels : List<TModel>
{
}
class TValue
{
}
class TStorage
{
public Dictionary<Guid, TValue> Items { get; set; }
}
class TArranged
{
public Dictionary<TModel, TValue> Items { get; set; }
}
static class Repository
{
static public TItem Single<TItem, TCollection>(Predicate<TItem> expression)
{
return default(TItem); // access logic.
}
}
class Sample
{
public void Run()
{
TStorage tStorage = new TStorage();
// access tStorage logic here.
Dictionary<TModel, TValue> d = new Dictionary<TModel, TValue>();
foreach (KeyValuePair<Guid, TValue> kv in tStorage.Items)
{
d.Add(Repository.Single<TModel, TModels>(m => m.Id == kv.Key),kv.Value);
}
}
}
答案 0 :(得分:1)
没有真正测试过这个,而且非常难看,但我认为这应该有效:
Dictionary<TModel, TValue> d = new Dictionary<TModel, TValue>();
d = d.Concat(tStorage
.Items
.Select(i => new KeyValuePair<TModel, TValue>(
new TModel { Id = i.Key }, i.Value))).ToDictionary(i => i.Key, i => i.Value);