我目前写了以下陈述:
List <string> eventTablesList = GetStringArgument("arg_event_tables", "UNKNOWN")
.Split(',')
.ToList<string>()
List<string> qualifiedStagingEventTableNamesList = new List<string>();
eventTablesList.ForEach(
eventTable => qualifiedStagingEventTableNamesList.Add(
ControlSQLCommand.GetQualifiedNameByKeyName(
eventTable,
"arg_insert_staging_event_table")));
请注意,我有两个列表。我想只有eventTablesList
并只是操纵列表来覆盖当前元素本身。我最初尝试如下:
eventTablesList.ForEach(
eventTable => eventTable = ControlSQLCommand.GetQualifiedNameByKeyName(
eventTable,
"arg_insert_staging_event_table")))
我原本认为匿名函数在LINQ查询中使用指向集合中当前元素的指针。我可以看到情况并非如此,因为在运行上述LINQ查询后,eventTablesList
元素永远不会被覆盖。有什么建议可以让它更轻盈/更优雅吗?
答案 0 :(得分:1)
如果您想以一个Linq表达式执行此操作,那么您将需要使用Select
List<string> eventTablesList = GetStringArgument("arg_event_tables", "UNKNOWN")
.Split(',')
.Select(eventTable => ControlSQLCommand.GetQualifiedNameByKeyName(
eventTable,
"arg_insert_staging_event_table"))
.ToList()
这里的想法是Select
会将逗号分隔列表中的字符串值转换为通过调用ControlSQLCommand.GetQualifiedNameByKeyName
返回的字符串值。
ForEach
版本无效的原因是eventTable
是列表中指向字符串的引用的副本。因此,为其指定新值不会更改列表中的引用所指向的位置。如果你改变了引用指向的对象,它会起作用,但是因为string
是不可变的,所以它也不起作用。
Jon Skeet有一篇非常好的博客文章,介绍了如何在C#中传递参数 Parameter passing in C#
答案 1 :(得分:0)
只需将以下Select
- 语句的结果分配给eventTablesList
:
eventTablesList = eventTablesList.Select(x => ControlSQLCommand.GetQualifiedNameByKeyName(
x,
"arg_insert_staging_event_table"));