C#数组转换

时间:2010-10-22 21:32:10

标签: c# .net arrays

这里有任何帮助,因为我是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;
    }

4 个答案:

答案 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)

如果您真的想要一个包含ViewState2EventValidation2的数组,您可以进行以下更改:

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

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