簡體   English   中英

params數組可以作為C#中列表的保持類型嗎?

[英]Can a params array be a holding type for a list in C#?

params []變量是否可以保存一個列表,該列表已作為參數通過C#中的方法傳遞?

寫了一個方法(AddIntegers),需要將多個值作為參數。 在方法的參數列表中,當在Main方法中進行方法調用時,有一個params []變量正在接收拋出的值。 但有一個例外,說“無法從system.collections.generic.List <>轉換為整數。任何人都知道為什么會發生這種情況?

       **** this is within the Main Method**** 
        string Demostring = Console.ReadLine();
        string[] tokens = Demostring.Split(',');
        List<int> nums = new List<int>();
        int oneNum;
        foreach(string s in tokens)
        {
            if (Int32.TryParse(s, out oneNum))
                nums.Add(oneNum);
        }

        int result1 = AddIntegers(nums);

        **** this is the method to be called****
        public static int AddIntegers(params int[] Restnum)
        {
            int result = 0;

            foreach(int temp in Restnum)
            {
                result += temp;
            }

             return result;
         }

不, List<int>不是int[] ,因此您不能將它用作int[]參數的參數。 (事實上​​,它是一個參數數組不會改變它。)

通常,解決方案是有兩個重載 - 一個接受參數數組,另一個接受IEnumerable<T>

public static int AddIntegers(params int[] numbers) =>
    AddIntegers((IEnumerable<int>) numbers);

public static int AddIntegers(IEnumerable<int> numbers)
{
    ...
}

請注意,對於此特定示例,您當然可以從LINQ調用Sum擴展方法到Objects。

有些建議讓參數數組能夠接受IReadOnlyList<T>而不僅僅是T[] ,但這還不在C#中。 (親愛的,我會愛上它的。)

這是因為您嘗試在數組參數中插入List。

而不是這個:

int result1 = AddIntegers(nums);

你可以這樣做:

int result1 = AddIntegers(nums.ToArray());

或者:

public static int AddIntegers(List<int> numbers)
{
     return AddIntegers(numbers.ToArray());
}

public static int AddIntegers(params int[] Restnum)
{
    int result = 0;

    foreach(int temp in Restnum)
    {
        result += temp;
    }

    return result;
}

然后像平時那樣打電話。

private void button4_Click(object sender, EventArgs e)
        {
            const string demostring = "1,2,3,4,5,6";
            var tokens = demostring.Split(',');
            var nums = new List<int>();
            foreach (var s in tokens)
                if (int.TryParse(s, out var oneNum))
                    nums.Add(oneNum);

            var result1 = AddIntegers(nums);
        }
        public static int AddIntegers(List<int> restnum)
        {
            var result = 0;

            foreach (var temp in restnum)
                result += temp;

            return result;
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM