我有如下功能。我需要返回两个参数。首先是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;
}
答案 0 :(得分:2)
好吧,由于__MODULE__
中的TreeNode.Index
不是唯一,因此TreeNodeCollection
不是Dictionary<int, String>
,Dictionary<int, List<String>>
会做1}} p>
//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。
这种方法相当容易出错,通常没有优先考虑。