有没有办法做到这一点,在 List<T>.ForEach() 语句中分配一个值?
Is there any way to do this, assign a value within a List<T>.ForEach() statement?
我有这个:
var lineArray = line.Split(';');
lineArray.ToList().ForEach(x =>
{
if (x == "(null)")
x = "NULL";
else
x = string.Format("'{0}'", x);
});
这运行良好,但似乎没有更改 lineArray
中的元素。我想将 ForEach
的结果分配给 var
但它 return 无效。
有什么想法吗?
编辑:我认为这是因为 ToList()
return 值未分配到任何地方...
不要那样使用 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]);
}
您可以从原来的列表构建一个新列表:
var newList = lineArray.Select(x => x == "(null)" ? "NULL" : string.Format("'{0}'", x));
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 可以工作
我认为这个小改动会奏效
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);
});
结果:
如果您只需要从列表中删除(空)值,则不需要循环
只需使用 removeAll
lineArray.RemoveAll(a=>a.Equals("(null)"));
下面的工作示例
我有这个:
var lineArray = line.Split(';');
lineArray.ToList().ForEach(x =>
{
if (x == "(null)")
x = "NULL";
else
x = string.Format("'{0}'", x);
});
这运行良好,但似乎没有更改 lineArray
中的元素。我想将 ForEach
的结果分配给 var
但它 return 无效。
有什么想法吗?
编辑:我认为这是因为 ToList()
return 值未分配到任何地方...
不要那样使用 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]);
}
您可以从原来的列表构建一个新列表:
var newList = lineArray.Select(x => x == "(null)" ? "NULL" : string.Format("'{0}'", x));
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 可以工作
我认为这个小改动会奏效
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);
});
结果:
如果您只需要从列表中删除(空)值,则不需要循环 只需使用 removeAll
lineArray.RemoveAll(a=>a.Equals("(null)"));
下面的工作示例