2010-10-22 54 views
1

任何帮助,因为我是C#noob。以下代码正常工作并返回1个字符串ViewState2。我希望它返回一个ViewState2和EventValidation2数组,以便稍后处理它。我将如何转换下面的代码来返回一个数组?C#数组转换

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

你是否希望数组元素0包含ViewState2和数组元素1中的内容以包含EventValidation2中的内容? – Nate 2010-10-22 21:33:28

+2

没有冒犯,但这段代码看起来像一个c#恐怖对我...尝试一些关于该语言的教程第一。或者至少阅读语言参考。 – Machta 2010-10-22 21:42:10

+0

我确定这是恐怖。我不是开发人员,这是我第一次编写c#。我的目标不是学习语言,而是完成任务。 – shaiss 2010-10-23 17:45:13

回答

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; 正确要做的事情是封装你想要返回的信息在它自己的类型中。

+0

这就是我所寻找的,因为我只需要快速和肮脏。谢谢! – shaiss 2010-10-25 11:49:17

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(或通常为异常类型)或具有非常长的类名称。写出类型名称可以提高可读性。

+0

您的答案是正确的做法,但由于缺乏C#经验,快速而肮脏的工作现在已成为现实。谢谢! – shaiss 2010-10-25 11:50:11

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; 
} 

这就是说,我会按照AFTE的做法线。


我会写有你想要的数据成员的类:

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; 
} 
0
string[] array = new string[2]; 

array[0] = ViewState2; 
array[1] = EventValidation2; 

return array; 

但它似乎微不足道的答案。请解决您的问题吗?如果不是,你能指定更好的问题吗?