2013-11-23 35 views
3

我习惯了使用“在线”返回一个值的功能,像这样:在线使用功能在C#中返回多个值

Label1.Text = firstString + functionReturnSecondString(aGivenParameter); 

可这对于返回两个函数来完成值?
假设例如:

label1.Text = multipleReturnFunction(parameter).firstValue 

我一直在寻找到返回多个值,它看起来像最好的选择是使用一个元组,结构或数组列表。

我做了一个工作函数,回调结构。然而,我得到它的工作方式,我需要先调用函数,然后我可以使用值。似乎不可能在不写另一个函数的情况下在同一行上完成所有操作。

multipleReturnFunction(parameter); 
Label1.Text = firstString + classOfStruct.secondString; 

我还没有做出返回元组或列表的函数,所以我不确定。是否可以调用这些函数并引用“内联”的返回值?

我感谢您的反馈。

+0

有人发布了一个很好的答案,然后把它拿下来......为什么?我很擅长在同一行上调用两次函数,即使它是“脏的”。 – Warped

+0

只需使用第二行。考虑到它让你的代码可读和快速,它确实不是那么糟糕。 –

+0

感谢您的所有好评!很难选择“最正确”的一个。搞清楚你们有些人想出了什么可能需要我一段时间:) – Warped

回答

2

我有一个难看黑客正是这种类型的场景 - 当你想不定义一个额外的变量来存储它执行的返回值的多个操作:

public static TResult Apply<TInput, TResult>(this TInput input, Func<TInput, TResult> transformation) 
{ 
    return transformation(input); 
} 

...这是原因它首先出现在:

var collection = Enumerable.Range(1, 3); 

// Average reimplemented with Aggregate. 
double average = collection 
    .Aggregate(
     new { Count = 0, Sum = 0 }, 
     (acc, i) => new { Count = acc.Count + 1, Sum = acc.Sum + i }) 
    .Apply(a => (double)a.Sum/(double)a.Count); // Note: we have access to both Sum and Count despite never having stored the result of the call to .Aggregate(). 

Console.WriteLine("Average: {0}", average); 

不用说,这是比实际生产代码更适合学术演习。

+0

我觉得喜欢它。我只是不明白它呢...必须研究... – Warped

1

或者,使用ref或他们的out关键字。

例子:

int a = 0, b = 0; 
void DoSomething(ref int a, ref int b) { 
    a = 1; 
    b = 2; 
} 

Console.WriteLine(a); // Prints 1 
Console.WriteLine(b); // Prints 2 

这不是内联和我本人会考虑一个类或使用refout关键字前的结构。让我们考虑一下理论:当你想要返回多个事物时,实际上你有一个对象具有多个属性,这些属性可以让你的函数的调用者可用。

因此,实际创建一个表示要提供并返回的对象(通过使用类或结构)会更加正确。

我使用refout关键字的唯一时间是使用DLL导入,因为这些函数通常具有指针作为其调用参数,我个人认为在典型的普通应用程序中使用它们没有任何好处。

+0

或'out'关键字 – Grundy

+1

您不能将未初始化的变量作为'ref'传递。 –

+2

我觉得'out'会更适合。 'ref'表示初始值很重要,'out'也允许未初始化的变量。 – ChrisK

1

为了做到这一点,我想你将不得不有另一种方法,需要你的结构,并给你你正在寻找的字符串。

public string NewMethod(object yourStruct) 
{ 
    return string.Format("{0} {1}", yourStruct.value1, yourStruct.value2); 
} 

然后在页面中,你这样做:

Label1.Text = NewMethod(multipleReturnFunction(parameter)); 
0

每种方法只能返回一个值。这就是通过指定访问 水平,如公立或私立,可选的改性剂,如抽象 或密封,返回,名称如何.NET中定义的方法

的方法在一个类或结构声明该方法,如果你需要比从方法一个价值回归更 参数

任何方法,那么你有三种选择:

  1. 返回将保存所有值的复杂类型。这在这种情况下无法帮助你,因为你需要局部变量来存储方法返回的值。
  2. 使用out参数。也不是你的情况 - 你需要在方法调用之前声明参数。
  3. 创建另一个方法,它可以完成所有工作并返回单个值。

第三种选择看起来像

Label1.Text = AnotherMethod(parameters); 

而且实现

public string AnotherMethod(parameters) 
{ 
    // use option 1 or 2 to get both values 
    // return combined string which uses both values and parameters 
} 

BTW还有一个选项 - 不返回值在所有 - 你可以使用方法,设置了几个类字段。

1

C#没有Inline function s,但确实支持anonymous functions,它可以是closure s。

有了这些技术,你可以说:

var firstString=default(String); 
var secondString=default(String); 

((Action<String>)(arg => { 
    firstString="abc"+arg; 
    secondString="xyz"; 
}))("wtf"); 

label1.Text=firstString+secondString; 

Debug.Print("{0}", label1.Text); 

((Action<String>)(arg => { 
    firstString="123"+arg; 
    secondString="456"; 
}))("???"); 

label1.Text=firstString+secondString; 

Debug.Print("{0}", label1.Text); 

或名称,委托和重用:

var firstString=default(String); 
var secondString=default(String); 

Action<String> m= 
    arg => { 
     firstString="abc"+arg; 
     secondString="xyz"; 
    }; 

m("wtf"); 
label1.Text=firstString+secondString; 
Debug.Print("{0}", label1.Text); 

m("???"); 
label1.Text=firstString+secondString; 
Debug.Print("{0}", label1.Text); 

所以,你真的需要一个方法返回多个值吗?

+2

真棒,在.net上五年,我从来没有见过这种技巧..'((动作)(n => {}))(“nice!”)'! – NothingsImpossible

+0

@NothingsImpossible:哈,也许它的可读性很丑.. –

+0

'C#没有内联函数'不正确。 .Net提供它。所以C#可以使用它。 –