这里有任何帮助,因为我是C#noob。以下代码正常工作并返回1个字符串ViewState2。我希望它返回一个ViewState2和EventValidation2数组,以便稍后我可以操作它。我如何转换下面的代码以返回数组?
public string get_status(string local_fname)
{
var dts_doc = new HtmlAgilityPack.HtmlDocument();
dts_doc.Load(local_fname);
//Pull the values
var ViewState = dts_doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[1]/input[4]/@value[1]");
var EventValidation = dts_doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[2]/input[1]/@value[1]");
string ViewState2 = ViewState.Attributes[3].Value;
string EventValidation2 = EventValidation.Attributes[3].Value;
//Display the values
//System.Console.WriteLine(ViewState.Attributes[3].Value);
//System.Console.WriteLine(EventValidation.Attributes[3].Value);
//System.Console.ReadKey();
return ViewState2;
}
答案 0 :(得分:4)
不要使用数组,而是使用类。这样做,您不必记住每个元素的含义。
public class Status
{
public string ViewState {get; set;}
public string EventValidation {get; set;}
}
using System;
using HtmlAgilityPack;
[...]
public Status GetStatus(string localFileName)
{
var dtsDoc = new HtmlDocument();
dtsDoc.Load(localFileName);
//Pull the values
var viewStateNode = dtsDoc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[1]/input[4]/@value[1]");
var eventValidationNode = dtsDoc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[2]/input[1]/@value[1]");
string viewState = viewStateNode.Attributes[3].Value;
string eventValidation = eventValidationNode.Attributes[3].Value;
//Display the values
//Console.WriteLine(viewState);
//Console.WriteLine(eventValidation);
//Console.ReadKey();
return new Status
{
ViewState = viewState,
EventValidation = eventValidation
}
}
此外,您应该阅读C#语言中的编码指南和命名约定,using
语句也可能很有趣。我纠正了一些“错误”,但可能没有抓住所有错误。此外,我已经重命名了几个变量,以使其内容更清晰。您还可能希望仅在循环中使用var
关键字,同时使用LINQ(或一般的无形类型)或使用非常长的类名。写出来的类型名称可以提高可读性。
答案 1 :(得分:2)
如果您真的想要一个包含ViewState2
和EventValidation2
的数组,您可以进行以下更改:
// Notice: return value of string[] instead of string
public string[] get_status(string local_frame);
和
// Notice: returning an array
return new string[] { ViewState2, EventValidation2 };
也就是说,这实际上是“快速而肮脏”的方法,如果您希望这段代码可以维护(当您最后一次阅读“返回数组的函数的文档时”),这种方法并不合适长度为2,字符串表示X作为第一个元素,另一个字符串表示Y作为第二个“?”。
Femaref's right; 正确的要做的事情就是将你想要的信息封装在自己的类型中。
答案 2 :(得分:0)
假设你对这个问题的答案是肯定的(尽管我建议采用不同的方法,请参见下文),这样做可以满足您的要求:
public String[] get_status(string local_fname)
{
var dts_doc = new HtmlAgilityPack.HtmlDocument();
dts_doc.Load(local_fname);
//Pull the values
var ViewState = dts_doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[1]/input[4]/@value[1]");
var EventValidation = dts_doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[2]/input[1]/@value[1]");
string ViewState2 = ViewState.Attributes[3].Value;
string EventValidation2 = EventValidation.Attributes[3].Value;
String[] retValues = new String[2];
retValues[0] = ViewState2;
retValues[1] = EventValidation2;
return retValues;
//Display the values
//System.Console.WriteLine(ViewState.Attributes[3].Value);
//System.Console.WriteLine(EventValidation.Attributes[3].Value);
//System.Console.ReadKey();
return ViewState2;
}
那就是说,我会遵循这条路线。
我会编写一个包含所需数据成员的类:
public class DataClass
{
public string ViewState { get; set; }
public string EventValidation { get; set; }
}
然后我会修改方法以返回数据类的实例。
public DataClass get_status(string local_fname)
{
var dts_doc = new HtmlAgilityPack.HtmlDocument();
dts_doc.Load(local_fname);
//Pull the values
var ViewState = dts_doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[1]/input[4]/@value[1]");
var EventValidation = dts_doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[2]/input[1]/@value[1]");
var dc = new DataClass();
dc.ViewState = ViewState.Attributes[3].Value;
dc.EventValidation = EventValidation.Attributes[3].Value;
return dc;
}
答案 3 :(得分:0)
string[] array = new string[2];
array[0] = ViewState2;
array[1] = EventValidation2;
return array;
但这似乎是微不足道的回答。请问它能解决你的问题吗?如果不是,你能指出更好的问题吗?