返回整数和字符串

时间:2016-03-03 09:18:36

标签: c# .net

我有如下功能。我需要返回两个参数。首先是list的索引,它由函数完成。我需要返回的另一个参数是字符串str。 对于这些输出,您最好的建议是什么?包含两个不同参数的列表?或者是什么?请让我知道你的想法!感谢

public List<int> index_selexted(TreeNodeCollection treeView, List<int> list)
{
    List<int, List<string>> output_typ = new List<int, >();
    foreach (TreeNode node in treeView)
    {
        if (node.Checked)
        {
            list.Add(node.Index);
            string str = Regex.Match(node.Text, @" \((.*?)\) ").Groups[1].Value;            
        }
        else
        {
            index_selexted(node.Nodes, list);
        }
    }
    return list;
}

5 个答案:

答案 0 :(得分:2)

好吧,由于__MODULE__中的TreeNode.Index不是唯一,因此TreeNodeCollection不是Dictionary<int, String>Dictionary<int, List<String>>会做

//TODO: find a better name for dict
public Dictionary<int, List<String>> index_selexted(
  TreeNodeCollection treeView, 
  Dictionary<int, List<String>> dict == null) { // == null for autocreation

  if (null == treeView)  
    throw new ArgumentNullException("treeView");

  if (null == dict)
    dict = new Dictionary<int, List<String>>();

  foreach (TreeNode node in treeView) 
    if (node.Checked) {
      String match = Regex.Match(node.Text, @" \((.*?)\) ").Groups[1].Value; 

      List<String> list;

      if (dict.TryGetValue(node.Index, out list))  
        list.Add(match);
      else
        dict.Add(node.Index, new List<String>() {match}); 
    }
    else 
      index_selexted(node.Nodes, dict);

  return dict;
}

所以你会输出这样的东西: index +所有匹配

  {1, ["abc", "def", "gh"]}
  {3, ["xyz"]}

我已添加dict == null以便更轻松地进行通话:

  // You don't have to pre-create the dictionary
  var myDict = index_selexted(myTreeView.Nodes);

答案 1 :(得分:1)

使用Tuple

var res = new Tuple<string, List<string>>("string1", new List<string>());

答案 2 :(得分:0)

你可以做

public class IndexSelectionResult{
    public List<something> Index{get;set;}  
    public String StringResult 
}

并返回一个实例,或者,如果你懒惰,你可以返回一个TUPLE:

public Tuple<List<string>, string>> myFunction(){ /* code */}

答案 3 :(得分:0)

我相信你想要这个:

    public static List<int> index_selexted(TreeNodeCollection treeView, out string str)
    {
        str = null;

        var list = new List<int>();
        var output_typ = new List<int>();

        foreach (TreeNode node in treeView)
        {
            if (node.Checked)
            {
                list.Add(node.Index);
                str = Regex.Match(node.Text, @" \((.*?)\) ").Groups[1].Value;            
            }
            else
            {
                index_selexted(node.Nodes, list);
            }
        }

        return list;
    }

用法:

var treeview = sometreeview;
string output;
var result = index_selected(treeview, out output);
Console.WriteLine(output);

而不是使用示例中的列表(List&gt; output_typ = new List();)考虑

使用字典:

var output_typ = new Dictionary<int, List<string>>();

或元组列表:

var output_typ = new List<Tuple<int, List<string>>();

希望这有帮助

答案 4 :(得分:0)

实际上有很多方法可以做到这一点,这取决于您特定的用例,而不是您喜欢的用途。

使用课程

class MyResult {
    public List<int> MyList { get; set; }
    public string MyString { get; set; }
}

public MyResult index_selected(arg1..., arg2...) {
   return new MyResult {
      MyList = outputList,
      MyString = "outputString"
   }
}

使用课程是我的首选方式。虽然如果你有很多返回类型它可能会混乱,但它是迄今为止最易读的解决方案。

使用元组

public Tuple<List<int>, string> index_selected(arg1..., arg2...) {
   return Tuple.Create(outputList, "outputString");
}

我的第二个goto选项是一个元组。确定元组中包含的值代表什么要困难得多。但是不需要创建更多的类并且是一个快速的解决方案(我主要用于那些可读性不是很重要的私有方法)。

使用out关键字

public List<int> index_selected(arg1..., out string resultString) {
   resultString = null;
   /* Doing calculations and such */
   resultString = "
   return outputList;
}

在这种情况下,传递给resultString参数的字符串将替换为您在方法中分配给它的任何内容(请参阅out keyword)。根据您的使用情况,您可能还需要查看ref keyword

这种方法相当容易出错,通常没有优先考虑。