有没有办法做到这一点,在List <t> .ForEach()语句中分配一个值?

时间:2015-06-01 18:57:36

标签: c# .net-3.5

我有这个:

var lineArray = line.Split(';');

lineArray.ToList().ForEach(x =>
{
    if (x == "(null)")
        x = "NULL";
    else
        x = string.Format("'{0}'", x);
});

这样运行正常,但似乎没有改变lineArray中的元素。我想到将ForEach的结果分配给var,但它返回无效。

有什么想法吗?

编辑:我认为这是因为ToList()返回值未在任何地方分配...

4 个答案:

答案 0 :(得分:7)

var lineArray = line.Split(';')
                    .Select(x=>x == "(null)"
                               ? "NULL"
                               : string.Format("'{0}'", x))
                    .ToArray();

您正在尝试将List<T>.ForEach(Action<T> action)与lambda表达式一起使用(T在此为字符串)

如果lambda表达式被命名方法替换,则事实证明只修改了方法参数,但更改未反映在调用方,因为x不是ref参数

private void Replace(string x)
{
    if (x == "(null)")
        x = "NULL";
    else
        x = string.Format("'{0}'", x);
}

var list = lineArray.ToList();
list.ForEach(Replace);
// check list here and make sure that there are no changes

如果T是引用类型并且操作修改了某些属性而不是引用本身

,则ForEach可以工作

答案 1 :(得分:5)

不要那样使用ForEach - 使用for循环。

for (int i = 0; i < lineArray.Length; i++)
{
    if (lineArray[i] == "(null)")
        lineArray[i] = "NULL";
    else
        lineArray[i] = string.Format("'{0}'", lineArray[i]);
}

答案 2 :(得分:0)

您可以从原始列表中构建一个新列表:

var newList = lineArray.Select(x => x == "(null)" ? "NULL" : string.Format("'{0}'", x));

答案 3 :(得分:-1)

我认为这个小小的改变会起作用

 var lineArray = line.Split(';').ToList();

        lineArray.ForEach(x =>
        {
            if (x == "(null)")
                x = "NULL";
            else
                x = string.Format("'{0}'", x);
        });

以下是一个工作示例

string line = "a;b;null;c;";

var lineArray = line.Split(';').ToList();

    lineArray.ForEach(x =>
    {
        if (x == "(null)")
            x = "NULL";
        else
            x = string.Format("'{0}'", x);
    });

结果:enter image description here

如果只需从列表中删除(null)值,则无需循环 只需使用removeAll

    lineArray.RemoveAll(a=>a.Equals("(null)"));

下面的工作示例

enter image description here