Lambda表达式如何在List <string>?</string>上执行String.Format

时间:2009-12-30 14:36:20

标签: c# lambda

我有一个列表:

List<String> test = new List<String> {"Luke", "Leia"};

我想使用这样的东西:

test.Select(s => String.Format("Hello {0}", s));

但它不会调整列表中的名称。有没有办法使用lambda表达式来改变这些?或者是因为字符串是不可变的,这不起作用?

4 个答案:

答案 0 :(得分:12)

Select不会修改原始集合;它创建了一个新的IEnumerable&lt; T&gt;您可以使用 foreach 枚举或转换为列表:

List<String> test2 = test.Select(s => String.Format("Hello {0}", s)).ToList();

test 仍然包含“Luke”“Leia”,而 test2 包含“Hello卢克“”你好莱娅“


如果要使用lambda表达式修改原始列表,可以将lambda表达式单独应用于每个列表项,并将结果存储回集合中:

Func<string, string> f = s => String.Format("Hello {0}", s);

for (int i = 0; i < test.Count; i++)
{
    test[i] = f(test[i]);
}

答案 1 :(得分:3)

下面:

for(int i = 0; i < test.Count; i++) {
    test[i] = String.Format("Hello {0}", test[i]);
}

不需要花哨。无需滥用LINQ。保持简单。

您可以超越这一步并创建一个类似的扩展方法:

static class ListExtensions {
    public static void AlterList<T>(this List<T> list, Func<T, T> selector) {
        for(int index = 0; index < list.Count; index++) {
            list[index] = selector(list[index]);
        }
    }
}

用法:

test.AlterList(s => String.Format("Hello {0}", s));

Select用于投射,实际上是用于没有副作用的情况。非常清楚地操作列表中的项目会产生副作用。实际上,行

test.Select(s => String.Format("Hello {0}", s));
除了创建最终可以枚举以生成投影的IEnumerable<string>之外,

不会做任何事情。

答案 2 :(得分:0)

另一种可能的解决方案:

List<String> test = new List<String> {"Luke", "Leia"};
List<string> FormattedStrings = new List<string>();
test.ForEach(testVal => FormattedStrings.Add(String.Format("Hello {0}", testVal)));

答案 3 :(得分:-2)

你可以做一个foreach声明:

test.ForEach(s=>String.Format("Hello {0}", s));

如果您尝试更新名称,那就是这样。