设置 Dictionary<long, List<string>> 值的 Linq 语法

Linq syntax to set values of Dictionary<long, List<string>>

从字典设置字符串列表的 Linq 语法是什么,其中 long Object.objectid 与字典 long 匹配?

对于成员"member"中的每个人,如果长id匹配,我想从列表中添加字符串值。

partial class BandMember
{
    public List<string> summary { get; set; }
}

public class BandViewModel
{
    public IList<BandMember> Members { get; set; }
}

public class BandMemberSummary : BandViewModel
{
    Dictionary<long, List<string>> _summary;

    public Dictionary<long, List<string>> Summary
    {

        get { return _summary; }
        set
        {
            _summary = value;

            foreach (var member in Members)
            {
                List<string> list;
                if (_summary.TryGetValue(member.objectId, out list))
                    member.summary.AddRange(list);
            }

        }
    }

}

member.summary 是显示在视图中的字符串值列表。

由于member.summary是一个List<string>,你可以使用List<T>.AddRange()方法方便地将IEnumerable<T>的所有条目添加到列表中(一个List<string> 还实现了 IEnumerable<string>).

当我正确解释成员选择查询时,这只不过是访问字典中带有键 member.objectId 的条目,这可以简单地使用 [] 运算符完成。

在您的具体示例中,它的内容如下:

Dictionary<long, List<string>> _summary;

public Dictionary<long, List<string>> Summary
{
    get { return _summary; }
    set
    {
        _summary = value;

        foreach (var member in Members)
        {
            member.summary.AddRange(_summary[member.objectId]);
        }
    }
}

但是,当然,这只是一种可能。您也可以自己 运行 循环,然后手动添加每个项目。事实上,AddRange 做的可能不止于此,但如果你习惯了 Linq,它看起来更干净。

此外,如果您不确定,_summary 已经包含 member.objectId 的条目,您可以使用 TryGetValue 方法 (https://msdn.microsoft.com/en-us/library/bb347013%28v=vs.110%29.aspx)。这部分将读作:

Dictionary<long, List<string>> _summary;

public Dictionary<long, List<string>> Summary
{
    get { return _summary; }
    set
    {
        _summary = value;

        foreach (var member in Members)
        {
            List<string> list;
            if (_summary.TryGetValue(member.objectId, out list))
            {
                if (member.summary == null)
                    member.summary = new List<string>();
                member.summary.AddRange(list);
            }
        }
    }
}

我认为这比您当前的查询稍微好一点:

public Dictionary<long, List<string>> Summary
{
    get { return _summary; }
    set
    {
        _summary = value;

        foreach (var x in
            from member in Members
            join s in _summary on member.objectId equals s.Key
            select new { member, values = s.Value })
        {
            x.member.summary.AddRange(x.values);
        }
    }
}