【问题标题】:Assigning list with one value after index在索引后为列表分配一个值
【发布时间】:2014-01-22 23:45:58
【问题描述】:

是否可以在特定索引之后快速阻止设置具有值的列表?

如何用 C# 编写以下逻辑?如果我能做到这一点,我可以使用不同的集合。

List<int> mylist = new List<int>(10);

int index = 3;
int value = 11;
mylist.SetValuesafterIndex(index, value);

编辑:

澄清:我的意思是,我希望将索引 3 到 9(含)设置为值 11

【问题讨论】:

  • @DavidHeffernan-是的,绝对的
  • 更改了问题。我仍然认为第一行非常明确地说明了我想要什么。
  • @Jimmy 好吧,我理解,但我认为存在一定的误解。反正现在已经很清楚了。

标签: c# list


【解决方案1】:

List&lt;T&gt;没有提供你想要的方法。所以,虽然这是一个显而易见的陈述,但你完全可以这样写:

for (int i = index; i < list.Count; i++) 
    list[i] = value;

想到的唯一其他选择是使用RemoveRange 删除从Index 到最后的所有项目,然后调用AddRange 添加新值。

由于您将性能作为一个问题,您应该根据您的实际使用场景对选项进行一些测量。

【讨论】:

  • 我倾向于同意。 RemoveRange 和 AddRange 看起来是唯一的选择。将等待更多时间来获得任何神奇的想法:-)。
  • 我怀疑会有for循环更快的场景,以及替代更快的其他场景。
  • 我明白你的意思。 msdn 说 addrange 和 removerange 是 o(n) 操作。阅读此答案后,我的印象有所不同,其中 Jon 建议使用 addrange 进行列表初始化stackoverflow.com/questions/466946/…
【解决方案2】:

试试下面的

mylist[index] = value;

目前尚不清楚您希望它位于index 还是index + 1。只需适当调整上述内容即可

【讨论】:

  • 我想在索引后设置一个“块”来设置列表大小。
  • @Jimmy 什么是块集?
  • 将列表中索引后的所有项目设置为给定值。例如,如果列表的大小为 10,我想将索引 3(索引 3-9)之后的所有值设置为给定值。
【解决方案3】:

对性能不太确定,但一个简单的答案可能是:

myList.AddRange(Enumerable.Repeat(0, index).Concat(Enumerable.Repeat(value, 10 - index)));

【讨论】:

  • 但是,列表中index之前的值不能被丢弃。
  • 它是一个int的列表,index前的值必须在进一步处理之前初始化。
【解决方案4】:

你可以这样写一个泛型方法:

 static void SetRangeValues<T>(List<T> list,int start,int end,T value)
 {
       if(end > list.Count() || start < 0) 
           throw new ArgumentOutOfRangeException();

        for(int i=start;i<end;i++)
        {
            list[i] = value;
        }
 }

你可以这样使用它:

var list = new List<int>();
list.AddRange(Enumerable.Range(0,10));

Console.WriteLine("Before: ");
list.ForEach(Console.WriteLine);

SetRangeValues(ref list, 3, 10, 2000);

Console.WriteLine("After: ");
list.ForEach(Console.WriteLine);

// Output:

Before:
0
1
2
3
4
5
6
7
8
9
After:
0
1
2
2000
2000
2000
2000
2000
2000
2000

如果你想将值设置到列表的末尾,只需将list.Count 作为end 参数传递:

SetRangeValues(list, 3, list.Count(), 2000);

【讨论】:

  • 鉴于List&lt;T&gt; 已经这样做了,因此测试和抛出ArgumentOutOfRangeException 有点毫无意义。您不妨让它完成这项工作,从而少做一次检查。
  • @DavidHeffernan 你说得对,但也许 OP 想改变这种行为,也许他想显示一条消息并立即从函数返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多