将 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元素永远不会被覆盖。有什么建议可以使其更轻巧/优雅吗?

将 IEnumerable 匿名语句中的当前集合项替换为语句的结果

如果要将其作为一个 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"));