我正在尝试调用一个函数,该函数返回带有两个数组的元组。数组的内容基于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>;
}
在上面的代码示例中,我无法返回元组。我收到错误消息“无法将方法组“创建”转换为非委托类型“元组””。
这是我第一次使用元组,如何在不调用两次函数的情况下返回两个数组?
我研究了略微相似的问题,因此,如果在其他地方已经回答了该问题,我将很高兴被指出正确的方向。
答案 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.
}
}