返回并调用多个数组

时间:2018-06-27 10:23:39

标签: c#

我有一个方法可以返回五个不同维度的数组:

public static (string[],string[],string[,],string[,],string[,]) deserializeobject(string filename)
{
    return (Auftraggeber, Aufstellungsort, Anlagen, Vorgang_rückgemeldet, Vorgang_zukünftig);
}

如何正确调用此方法以进一步处理数组?

3 个答案:

答案 0 :(得分:3)

我会强烈建议为此创建一个类,特别是因为该方法是公共的,因此可以在多个上下文中使用。这样一来,API用户就可以轻松确定每个返回成员的含义。

您的单个​​成员似乎总有卑鄙的意思,那么为什么要扔掉它并返回无名的参数集呢?

class MyObject
{
    public string[] Auftraggeber { get; set; }
    public string[] Aufstellungsort { get; set; }
    public string[] Anlagen { get; set; }
    public string[] Vorgang_rückgemeldet { get; set; }
    public string[] Vorgang_zukünftig { get; set; }
}

并且:

public static MyObject Deserialize(string fileName)
{
    return new MyObject { AuftragGeber = ... };
}

现在,您的方法的用户可以轻松确定参数的含义:

var o = deserialize(myFile);
DoSomething(o.Aufstellungsort);

比这更容易阅读:

var o DoSomething(myFile);
DoSomething(o.Item2);

不是吗?除此之外,它还限制了错别字。在第二种情况下,用户在实际使用Item2时可以轻松键入Item1,这可能在调试时引起头痛。每个成员都有一个后裔,这些错别字的可能性要小得多。

答案 1 :(得分:1)

首先回答您的问题:

给出:

public static (string[], string[], string[,], string[,], string[,]) deserializeobject(string filename)
{
    // Some value that will be returned... Just doing a test here
    return default((string[], string[], string[,], string[,], string[,]));
}

您可以:

// Using var
var des1 = deserializeobject("foo.bin");
Console.WriteLine($"Lengths: {des1.Item1.Length}, {des1.Item2.Length}, {des1.Item3.Length}, {des1.Item4.Length}, {des1.Item5.Length}");

// Legal, but too much verbose
(string[], string[], string[,], string[,], string[,]) des2 = deserializeobject("foo.bin");

// Legal too, because in truth the ValueTuple<> struct is used
ValueTuple<string[], string[], string[,], string[,], string[,]> des3 = deserializeobject("foo.bin");

现在,这里的问题是,正如我在评论中所写的那样,您需要一种特殊的仇恨方式供同事使用。为什么?因为如果我问您Item4是什么,您能给我答复吗?否:-)幸运的是,有两种选择:创建包含返回值的完整类/结构或使用命名元组。我非常反对创建一个只能由单个方法使用的类,因此我将向您展示命名的元组方式。

使用命名元组,您可以:

public static (string[] Auftraggeber, string[] Aufstellungsort, string[,] Anlagen, string[,] VorgangRückgemeldet, string[,] VorgangZukünftig) deserializeobject2(string filename)
{
    return default((string[], string[], string[,], string[,], string[,]));
}

然后您可以:

// Using var, with named arguments:
var des4 = deserializeobject2("foo.bin");
Console.WriteLine($"Lengths: {des4.Auftraggeber.Length}, {des4.Aufstellungsort.Length}, {des4.Anlagen.Length}, {des4.VorgangRückgemeldet.Length}, {des4.VorgangZukünftig.Length}");

看到了吗?您的方法返回的项目(数组)的名称将得到维护...

请注意,命名元组是徒劳的。下方没有命名元组。只有ValueTuple<>带有“注释”并带有所需属性的名称。

这是合法的:

ValueTuple<string[], string[], string[,], string[,], string[,]> des5 = des4;

注释中问题的完整示例:

public static (string[] Auftraggeber, string[] Aufstellungsort, string[,] Anlagen, string[,] VorgangRückgemeldet, string[,] VorgangZukünftig) deserializeobject2(string filename)
{
    // Define/create/fill the arrays
    var auftraggeber = new string[10];
    var aufstellungsort = new string[10];
    var anlagen = new string[10, 10];
    var vorgangRückgemeldet = new string[10, 10];
    var vorgangZukünftig = new string[10, 10];

    // Return the arrays
    return (auftraggeber, aufstellungsort, anlagen, vorgangRückgemeldet, vorgangZukünftig);
}

答案 2 :(得分:0)

使用元组<>,如以下代码所示:

   public Tuple<int[], int[]> GetMultipleValue(string name)
   {
      int[] a = new int[]{1,2,3,4}
      int[] b = new int[]{5,6,7,8}
      return Tuple.Create(a,b);
   }