设置 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);
}
}
}
从字典设置字符串列表的 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);
}
}
}