【发布时间】:2012-03-14 18:50:57
【问题描述】:
您好,我在将属性值从一个列表项分配给另一个项时遇到了一点问题。我知道我可以通过迭代两个列表等来解决它“旧方法”,但我正在寻找使用 LINQ 的更优雅的解决方案。
让我们从代码开始...
class SourceType
{
public int Id;
public string Name;
// other properties
}
class DestinationType
{
public int Id;
public string Name;
// other properties
}
List<SourceType> sourceList = new List<SourceType>();
sourceList.Add(new SourceType { Id = 1, Name = "1111" });
sourceList.Add(new SourceType { Id = 2, Name = "2222" });
sourceList.Add(new SourceType { Id = 3, Name = "3333" });
sourceList.Add(new SourceType { Id = 5, Name = "5555" });
List<DestinationType> destinationList = new List<DestinationType>();
destinationList.Add(new DestinationType { Id = 1, Name = null });
destinationList.Add(new DestinationType { Id = 2, Name = null });
destinationList.Add(new DestinationType { Id = 3, Name = null });
destinationList.Add(new DestinationType { Id = 4, Name = null });
我想实现以下目标:
- destinationList 应填写 sourceList 中相应条目的名称(按 Id)
- destinationList 不应包含同时出现在两个列表中的条目(例如,应消除 ID:4,5) - 类似于内部连接
- 我想避免使用更新的条目创建新的destinationList,因为这两个列表已经存在并且非常大, 所以没有“转换”或“选择新”。
最终destinationList应该包含:
1 "1111"
2 "2222"
3 "3333"
使用 LINQ 是否有某种优雅的(单行 Lambda?;)解决方案?
任何帮助将不胜感激!谢谢!
【问题讨论】:
-
LINQ 倾向于返回一个新的结果集,因为它遵循查询模式,因此它通常不用于更新它正在查询的序列。
-
所以,澄清一下,您希望此过程将destinationList 更改为a) 从sourceList 中复制名称已经存在的位置,b) 删除destinationList 中没有sourceList 中的id 的任何项目?
-
如果您的列表非常大并且您想使用 inne-join 语义,请考虑使用列表以外的其他内容。您需要按 Id 索引这两个列表,否则加入它们会非常慢
-
搜索列表会很昂贵,并且算法的运行时间为 O(N^2)。对于第一个列表 (N) 中的每个项目,您必须在第二个列表中找到与 id 匹配的项目。 (N) 如果您打算针对多个项目执行此操作,我会考虑使用针对搜索进行优化的不同数据结构。
-
@JamesMichaelHare - 是的,或者反过来,首先以某种方式通过 Id 加入,然后分配名称。