C# 以最简单的方式更改列表中的特定元素

C# 以最简单的方式更改列表中的特定元素,c#,arrays,list,C#,Arrays,List,基本上,我所做的是 for (var i = 0; i < someList.Count; i++){ if (someList[i] == x){ someList[i] = y; } } for(var i=0;ii==x?y:i))的单行程序,但是我不认为有一个线性函数可以改变现有的数组。一个for-循环就是为这样的事情做的。你为什么要用不同的东西?另外,如果它是一个数组,为什么要使用someList.Count?我个人不喜欢它,我肯定要考虑一下它的功能:)不

基本上,我所做的是

for (var i = 0; i < someList.Count; i++){
    if (someList[i] == x){
    someList[i] = y;
  }
} 
for(var i=0;i
我很确定应该有一艘这样的班轮。有什么建议吗

编辑: 在我的例子中,只有一个元素应该被改变,这是在主题中陈述的。 呈现的代码更改了所有实例,这就是我不喜欢的地方。这是一个开销,这就是为什么我问简化

关于数组/列表选择-让我们考虑这是关于列表(改变话题)。很抱歉提供误导性信息。

当然可以:

var listResult = someList.ToList().ForEach(i => i = i == x ? y : i);

好吧,所以我用三元运算符作弊了一点,但它是一行的!确保将
System.Linq
添加到您的使用中。

如果保证数组中最多有一个“x”,您可以编写如下内容:

var i = Array.IndexOf(array, x);
if (i >= 0) array[i] = y;
list.ReplaceFirst(2, 5555555);
但是,如果您可以有更多的“x”元素,并且您希望更改所有元素,那么我认为没有较短的版本,或者至少它不会太干净和可读。例如,在这里强制使用林克魔法将是一种彻底的过度杀戮。for循环是最可读、最简洁的方式。

您可以这样做

someList = someList.Select(i => i == x ? y : i).ToList();
编辑:


根据您的编辑,此代码将更改数组中等于
x

的每个元素。对于一行程序,您可以始终使用。让循环仅替换第一个元素的唯一修改是使用
break
关键字(它将退出循环)。这是方法的扩展方法定义:

public static void ReplaceFirst<T> (this List<T> list, T x, T y)
{
    for (var i = 0; i < list.Count; i++){
        if (Equals(list[i], x)){
        list[i] = y;
            break; //this stops the loop from further execution
        }
    } 
}

A

我不认为这是一个单行程序。我想不出一个单行程序,但考虑到x和y不同,使用两行程序:在循环中使用Array.IndexOf。。。(检查x和y是否不同需要再次使用第三行)@deviantfan IndexOf无法处理数组中有更多“y”-s的情况。您可以创建一个返回新的
IEnumerable
someList.Select(i=>i==x?y:i)
)的单行程序,但是我不认为有一个线性函数可以改变现有的数组。一个
for
-循环就是为这样的事情做的。你为什么要用不同的东西?另外,如果它是一个数组,为什么要使用
someList.Count
?我个人不喜欢它,我肯定要考虑一下它的功能:)不值得我去想。@ZoltánTamási,但没有人要求一个可读的解决方案。OP已经有了。OP要求一艘班轮。(+1)这只是将参数覆盖到lambda。它从不写入数组。试试看——数组没有修改。现在它甚至没有编译,因为
List。ForEach
是一个无效的方法。谁投这个票?这太错误了。创建一个新集合,以便能够使用
列表。ForEach
,使用该集合修改不会更改原始引用的lambda。因此,即使
ToList()
不会创建一个完全不同的集合,这也无法工作。这个答案应该删除,它在所有可能的方面都是错误的。无意冒犯@BeautifulCoderTanks,这很有用。我不确定在我的情况下是否要使用
break
——数据可以更改,很难预测我应该让代码更快还是更广泛。无论如何,扩展方法就是答案。也许你可以使用IList,这样人们也可以将它用于数组,