返回带有两个数组的元组

时间:2019-03-29 13:32:36

标签: c# tuples

我正在尝试调用一个函数,该函数返回带有两个数组的元组。数组的内容基于checkedListBox中的选中项。 我定义数组并调用函数“ storeParametersInArrays”,如下所示。

string[] allowedObjects = new string[checkedListObjects.CheckedItems.Count]; // All allowed objects
string[] notallowedObjects = new string[checkedListObjects.Items.Count - checkedListObjects.CheckedItems.Count]; // All not allowed objects

Tuple<string[], string[]> ObjParameters = storeParametersInArrays(notallowedObjects, allowedObjects, checkedListObjects);
allowedObjects = ObjParameters.Item1;
notallowedObjects = ObjParameters.Item2;

所调用的函数定义为:

private Tuple<string[], string[]> storeParametersInArrays(string[] notallowed, string[] allowed, CheckedListBox checkedListBox)
{
    int i = 0; // allowed objects
    int j = 0; // not allowed objects
    int k = 0; // item counter

    foreach (object item in checkedListBox.Items)
    {
        if (!checkedListBox.CheckedItems.Contains(item))
        {
            notallowed[j++] = checkedListBox.Items[k].ToString();
        }
        else
        {
            allowed[i++] = checkedListBox.Items[k].ToString();
        }
        k++;
    }
    return Tuple.Create<allowed, notallowed>;
}

在上面的代码示例中,我无法返回元组。我收到错误消息“无法将方法组“创建”转换为非委托类型“元组””。

这是我第一次使用元组,如何在不调用两次函数的情况下返回两个数组?

我研究了略微相似的问题,因此,如果在其他地方已经回答了该问题,我将很高兴被指出正确的方向。

4 个答案:

答案 0 :(得分:4)

只是改变

 [  2722.   2955.   2971.   2989.   3039.   3793.   3808.   3824.   4975.
    5698.   5849.   5887.   5919.   6394.   6470.   6697.   7226.   7337.
    7392.   7532.   7813.   7841.   7860.   7880.   7915.   8682.   8694.
    8739.   8943.   8957.   9016.   9182.   9207.   9218.   9224.   9281.
    9294.   9546.   9614.   9630.   9638.   9672.   9697.   9955.   9972.
   10029.  10177.  10691.  10708.  10902.  11093.  11684.  11774.  11817.
   11835.  11852.  11877.  11948.  12049.  12350.  12380.  12395.  12510.
   12663.  12699.  12708.  12751.  12768.  12865.  12919.  12943.  13067.
   13079.  13285.  13321.  13335.  13457.  13475.]

return Tuple.Create<allowed, notallowed>;

第一种语法适用于泛型:return Tuple.Create(allowed, notallowed);

第二个方法调用:<

答案 1 :(得分:2)

您必须更正方法调用Tuple.Create

private Tuple<string[], string[]> storeParametersInArrays(string[] notallowed, string[] allowed, CheckedListBox checkedListBox)
{
    int i = 0; // allowed objects
    int j = 0; // not allowed objects
    int k = 0; // item counter

    foreach (object item in checkedListBox.Items)
    {
        if (!checkedListBox.CheckedItems.Contains(item))
        {
            notallowed[j++] = checkedListBox.Items[k].ToString();
        }
        else
        {
            allowed[i++] = checkedListBox.Items[k].ToString();
        }
        k++;
    }
    return Tuple.Create(allowed, notallowed);
}

答案 2 :(得分:2)

此行

return Tuple.Create<allowed, notallowed>;

替换为

return Tuple.Create<string[], string[]>(allowed, notallowed);

或者简单

return Tuple.Create(allowed, notallowed);

静态方法Create是一个通用方法,错误是您使用的值类似于Create方法将返回的类型。

答案 3 :(得分:1)

您将值放置在类型参数应放置的位置。但我认为可以在这里推断类型参数:

return Tuple.Create(allowed, notallowed);

但是,您可以使用新的ValueTuple。 C#7.0中引入了简化的tuple syntax

private (string[], string[]) storeParametersInArrays(
    string[] notallowed, string[] allowed, CheckedListBox checkedListBox)
{
    ...
    return (allowed, notallowed);
}

然后您可以使用以下方法将结果直接存储到现有变量中:

(allowedObjects, notallowedObjects) = storeParametersInArrays(
    notallowedObjects, allowedObjects, checkedListObjects);

但是由于数组是引用类型,所以您甚至不必从方法中返回它们。您没有将数组的副本传递给方法-仅引用。因此,该方法将填充原始数组。

private void storeParametersInArrays(
    string[] notallowed, string[] allowed, CheckedListBox checkedListBox)
{
    // Fill the arrays here.

    // No need for a return statement.
}

现在您可以写

storeParametersInArrays(notallowedObjects, allowedObjects, checkedListObjects);

// allowedObjects and notallowedObjects are now filled. Example
string firstAllowed = allowedObjects[0];

您甚至可以更进一步,并使用C#7.0中引入的Local functions。他们可以访问周围方法的变量,因此在这种情况下不需要参数。

void myButton_Click(object sender, RoutedEventArgs e)
{
    string[] allowedObjects = new string[...];
    string[] notallowedObjects = new string[...];

    storeParametersInArrays();

    // Use the result
    string firstAllowed = allowedObjects[0];

    // Nested local function
    void storeParametersInArrays()
    {
        // You can access allowedObjects, notallowedObjects and checkedListObjects here.
        // Fill the arrays.
    }
}