代码之家  ›  专栏  ›  技术社区  ›  Arkadiusz Kałkus

c#相当于JavaScript扩展运算符

  •  0
  • Arkadiusz Kałkus  · 技术社区  · 5 年前

    有没有类似C的实现 JavaScript's spread syntax

    var arr = new []{
       "1",
       "2"//...
    };
    
    Console.WriteLine(...arr);
    
    0 回复  |  直到 5 年前
        1
  •  19
  •   Rhyous    6 年前

    没有价差期权。这是有原因的。

    1. 属性不是C中的数组,除非使用params关键字
    2. 使用param关键字的属性必须:
      1. 共享同一类型
      2. 有一个可转换的共享类型,例如用于数字的double
      3. 类型为object[](因为object是所有事物的根类型)

    但是,尽管如此,您可以通过各种语言特性获得类似的功能。

    回答你的例子:

    C#

    var arr = new []{
       "1",
       "2"//...
    };
    
    Console.WriteLine(string.Join(", ", arr));
    

    您提供的链接有以下示例:

    Javascript扩展

    function sum(x, y, z) {
      return x + y + z;
    }
    
    const numbers = [1, 2, 3];
    
    console.log(sum(...numbers));
    // expected output: 6
    
    console.log(sum.apply(null, numbers));
    

    参数 在C#中,同一类型

    public int Sum(params int[] values)
    {
         return values.Sum(); // Using linq here shows part of why this doesn't make sense.
    }
    
    var numbers = new int[] {1,2,3};
    
    Console.WriteLine(Sum(numbers));
    

    在C#中,使用不同的数字类型,使用double

    public int Sum(params double[] values)
    {
         return values.Sum(); // Using linq here shows part of why this doesn't make sense.
    }
    
    var numbers = new double[] {1.5, 2.0, 3.0}; // Double usually doesn't have precision issues with small whole numbers
    
    Console.WriteLine(Sum(numbers));
    

    反思

    using System;
    using System.Reflection;
    
    namespace ReflectionExample
    {
        class Program
        {
            static void Main(string[] args)
            {
                var paramSet = new object[] { 1, 2.0, 3L };
                var mi = typeof(Program).GetMethod("Sum", BindingFlags.Public | BindingFlags.Static);
                Console.WriteLine(mi.Invoke(null, paramSet));
            }
    
            public static int Sum(int x, double y, long z)
            {
                return x + (int)y + (int)z;
            }
        }
    }
    
        2
  •  2
  •   Ian Mercer    5 年前

    获得类似行为的一个诀窍是接受 params SomeObject[][] 以及定义隐式运算符 SomeObject SomeObject[] . 现在可以传递 某物 和个人 某物 元素。

    public class Item
    {
        public string Text { get; }
    
        public Item (string text)
        {
            this.Text = text;
        }
    
        public static implicit operator Item[] (Item one) => new[] { one };
    }
    
    public class Print
    {
        // Accept a params of arrays of items (but also single items because of implicit cast)
    
        public static void WriteLine(params Item[][] items)
        {
            Console.WriteLine(string.Join(", ", items.SelectMany(x => x)));
        }
    }
    
    public class Test
    {
        public void Main()
        {
            var array = new[] { new Item("a1"), new Item("a2"), new Item("a3") };
            Print.WriteLine(new Item("one"), /* ... */ array, new Item("two")); 
        }
    }
    
        3
  •  2
  •   themefield Zain Ali    4 年前

    C中没有直接的预建库来处理Spread中内置的内容

    你会做一些类似的事情:

    var tempMethods = typeof(myClass).GetMethods();
    var tempFields = typeof(myClass).GetFields();
    var tempProperties = typeof(myClass).GetProperties();
    

    然后迭代并将其放入动态对象中:

    using System;
    using System.Collections.Generic;
    using System.Dynamic;
    
    namespace myApp
    {
        public class myClass
        {
            public string myProp { get; set; }
            public string myField;
            public string myFunction()
            {
                return "";
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                var fields = typeof(myClass).GetFields();
                dynamic EO = new ExpandoObject();
                foreach (int i = 0; i < fields.Length; i++)
                {
                    AddProperty(EO, "Language", "lang" + i);
                    Console.Write(EO.Language);
                }
            }
    
            public static void AddProperty(ExpandoObject expando, string propertyName, object propertyValue)
            {
                // ExpandoObject supports IDictionary so we can extend it like this
                var expandoDict = expando as IDictionary<string, object>;
                if (expandoDict.ContainsKey(propertyName))
                    expandoDict[propertyName] = propertyValue;
                else
                    expandoDict.Add(propertyName, propertyValue);
            }
        }
    } 
    

    https://www.oreilly.com/learning/building-c-objects-dynamically

        4
  •  -4
  •   segatasanshiro    5 年前

    您也可以执行以下操作

        var a  = new List<int>(new int[]{1,2,3}){5};
        Console.WriteLine(a.Count);
    

    将打印4