【问题标题】:C# how to treat ints like they are array? [closed]C# 如何将整数视为数组? [关闭]
【发布时间】:2023-04-11 09:38:01
【问题描述】:

假设我有 5 个 int 不是数组! 我想在 1 个循环中全部更改。有什么方法可以制作一个数组来获取这 5 个数字的值并可以直接更改它们?

类似:

int a = 10;
int b = 20;

int[] rihanna = // .... ? 

for(int a=0; a<rihanna.length;a++)
    rihanna[a]++;

Console.WriteLine("{0} {1} ",a,b) // what I want to see here is 11 and 21

【问题讨论】:

  • 你给你的变量实际的名字?那真好;那真甜!无论如何,您的问题不清楚,您应该改写它。
  • 没有什么,我的意思是没有,(好吧,几乎没有)让集体热血沸腾的不仅仅是“请给我代码。”
  • 您声明了一个数组的新实例,然后您自己将数字添加到数组中。或者你可以让一个 ChrisBrown 类助手来做这件事,哈哈!
  • 别忘了在 mileyCyrus 上运行 GC
  • 赞成,因为这是一种很好的心理锻炼,试图让这项工作变得更好,甚至和@AlexeiLevenkov 的回答一样好——也许不是现实生活中的代码,但有时你只是在玩这些愚蠢的事情......并且因为一个名为 rihanna! 的变量!

标签: c#


【解决方案1】:

如果您放宽要求,我认为有一种方法可以解决它 - 拥有一组实体,允许通过对数组的操作来修改本地 int 变量集。

为此,可以在委托数组中捕获对变量的引用,每个委托都采用ref int val

void Increase(ref int x) 
{
    x++;
}
void Set(ref int x, int amount) 
{
    x = amount;
}

void Sample()
{
  int a = 10;
  int b = 20;

  // Array of "increase variable" delegates
  var increaseElements = new Action[] { 
    () =>  Increase(ref a), 
    () =>  Increase(ref b) 
  };
  increaseElements[0](); // call delegate, unfortunately () instead of ++ 
  Console.WriteLine(a); // writes 11

  // And now with array of "set the variable" delegates:
  var setElements = new Action<int>[] { 
    v =>  Set(ref a,v), 
    v =>  Set(ref b,v) 
  };
  setElements[0](3); 
  Console.WriteLine(a); // writes 3 
}

注意事项

  • 直接使用委托,您必须使用 () 调用它们。
  • 可以通过将委托包装到一个对象中来解决() 而不是++ 的问题,该对象将调用Increase 作为其++ 实现......
  • Set 版本的问题需要调用 (3) 而不是 = 3 需要更多技巧 - 使用索引实现自定义类以重定向 set [index] 以调用保存的 setter 函数。

警告:这确实是出于娱乐目的 - 请不要在真实代码中尝试。

【讨论】:

    【解决方案2】:

    我想以下面的声明作为开头。尽管这可以满足您的要求..它很丑陋。这更符合您假设您可以使用 C#“只做”的事情。实际上它更难。

    unsafe {
        int* a = stackalloc int[1];
        int* b = stackalloc int[1];
    
        *a = 10;
        *b = 20;
    
        int*[] rihanna = { a, b };
    
        for (int i = 0; i < rihanna.Length; i++) {
            (*rihanna[i])++;
        }
    
        Console.WriteLine("{0} {1} ", *a, *b); // "11 21"
    }
    

    【讨论】:

    • “获取这 5 个数字的值并可以直接更改它们” - 我认为这意味着他希望数组只是引用原始变量并就地影响它们。
    • @JonathonReinhart 已编辑 :)
    • 我删除了我的反对票。你所拥有的对我来说看起来是正确的,但向 OP 提出这个建议是非常可怕的。
    • @JonathonReinhart 我同意.. 但我将把它留给 OP(P.S,刚刚测试过这个.. 它确实输出“11 21”)。这个想法是为了表明可以按照 OP 可能想要的方式来做这件事。但它绝对是丑陋的。
    【解决方案3】:

    一般来说,这里的答案是。这将要求 C# 允许引用整数(或其他值类型)which it does not(并且有充分的理由。)

    我能为您想出的最佳解决方案是使用带有ref parameter 的函数。由于无论如何您都在尝试对一堆任意整数变量进行操作,因此您仍然必须将它们全部列出。如何通过函数调用来做到这一点,如下所示:

    void Increase(ref int x) {
        x++;
    }
    
    int a = 10;
    int b = 20;
    
    Increase(ref a);
    Increase(ref b);
    

    【讨论】:

    • +1。对于疯狂使用 ref 参数来创建数组,请参阅我的答案在这个良好的开端展开。
    【解决方案4】:

    您实际上无法在 .NET 中执行此操作。 ints 是值类型,所以不能直接引用它们。

    但是,有很多方法可以解决这个问题。这只是一个:

    class IntReference
    {
        int Value { get; set; }
    }
    
    IntReference a = new IntReference() { Value = 10 };
    IntReference b = new IntReference() { Value = 20 };
    
    IntReference[] rihanna = { a, b };
    
    for (int i = 0; i < rihanna.Length; i++)
        rihanna[i].Value = rihanna[i].Value + 1;
    
    Console.WriteLine("{0} {1} ", a.Value, b.Value); // "11 21"
    

    虽然你真的不应该这样做,但永远。这与 .NET 中值类型的设计背道而驰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 2021-06-30
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      相关资源
      最近更新 更多