【问题标题】:Change specific element in list in the simplest way以最简单的方式更改列表中的特定元素
【发布时间】:2015-04-17 21:48:54
【问题描述】:

基本上,我所做的是

for (var i = 0; i < someList.Count; i++){
    if (someList[i] == x){
    someList[i] = y;
  }
} 

我很确定这种操作应该只有一条线。有什么建议吗?

编辑: 在我的情况下,只有一个元素应该改变,这在主题中有所说明。 呈现的代码会更改所有实例,这就是我不喜欢的地方。这是一个开销,这就是我询问简化的原因。

关于数组/列表选择 - 让我们认为这就是关于列表(更改主题)。对于误导性信息,我们深表歉意。

【问题讨论】:

  • 我不认为有一个单行的。
  • 考虑到 x 和 y 不同,不能想到单线,而是双线:在循环中使用 Array.IndexOf...(检查 x 和 y 是否不同将再次需要第三行)
  • @deviantfan IndexOf 不会处理数组中有更多“y”-s 的情况。
  • 您可以制作一个返回新的IEnumerable&lt;T&gt; (someList.Select(i =&gt; i == x ? y : i)) 的单行程序,但我认为没有单行程序可以改变现有数组。
  • for-loop 就是为这样的事情而设计的。为什么要使用不同的东西?还有,如果是数组,为什么要用someList.Count

标签: c# arrays list


【解决方案1】:

对于单行,您始终可以使用Extension Methods。让循环仅替换第一个元素的唯一修改是使用 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
        }
    } 
}

你这样称呼它:

list.ReplaceFirst(2, 5555555);

.NET Fiddle

【讨论】:

  • 谢谢,这很有用。我不确定是否要在我的情况下使用break - 数据可以更改,并且很难预测我是否应该让代码更快或更广泛。无论如何,扩展方法就是答案。
  • 也许你可以使用 IList 所以也可以将它与数组一起使用,
【解决方案2】:

你可以的

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

编辑:

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

【讨论】:

    【解决方案3】:

    当然:

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

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

    【讨论】:

    • 我个人不喜欢它,我肯定要考虑一下它的作用:) 不值得我想。
    • @ZoltánTamási 但是没有人要求一个可读的解决方案。 OP已经有了。 OP要求单线。 (+1)
    • 这只是将参数覆盖到 lambda。它从不写入数组。试试看——数组保持不变。
    • 现在它甚至无法编译,因为List.ForEach 是一个 void 方法。谁赞成这个?大错特错。创建一个能够使用 List.ForEach 的新集合,使用它来修改不会更改原始引用的 lambda。所以即使ToList() 不会创建一个完全不同的集合,这也行不通。
    • 这个答案应该被删除,它在所有可能的方面都是错误的。没有冒犯@beautifulcoder
    【解决方案4】:

    如果保证数组中最多有一个“x”,你可以这样写:

    var i = Array.IndexOf(array, x);
    if (i >= 0) array[i] = y;
    

    但是如果你可以有更多的“x”元素并且你想全部改变,那么我认为没有更短的版本,或者至少它不会太干净和可读。例如,在这里强制使用一些 LINQ 魔法将是完全矫枉过正,恕我直言。 for 循环是最易读、最干净的方式。

    【讨论】:

      猜你喜欢
      • 2022-11-05
      • 2021-03-18
      • 2021-12-05
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多