将 IEnumerable 匿名语句中的当前集合项替换为语句的结果
本文关键字:语句 集合 替换 结果 前集 IEnumerable | 更新日期: 2023-09-27 17:55:18
我目前写了以下语句:
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
元素永远不会被覆盖。有什么建议可以使其更轻巧/优雅吗?
如果要将其作为一个 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# 中传递参数,称为C# 中的参数传递
只需将以下 Select
-语句的结果分配给eventTablesList
:
eventTablesList = eventTablesList.Select(x => ControlSQLCommand.GetQualifiedNameByKeyName(
x,
"arg_insert_staging_event_table"));