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

时间:2016-07-06 18:00:11

标签: c# .net linq

我目前写了以下陈述:

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

2 个答案:

答案 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"));