在一个方法C#返回不同的列表

时间:2017-07-27 09:08:47

标签: c# .net visual-studio list return

如何在一种方法中返回不同的对象列表?我有一些方法可以返回某些类型的列表,而且我不知道 Parse 方法应该返回什么

public static [Something here (IList???)] Parse(string filePath)
{
    string[] lines = File.ReadAllLines(filePath);

    for (int i = 0; i < lines.Length; i++)
    {
        string recordId = lines[i].Substring(0, 2);
        switch (recordId)
        {
            case "00":

                return Parse00(lines[i]); //public static List<mainInfo> Parse00(string line);

            case "11":

                return Parse11(lines[i]); //public static List<param> Parse11(string line);

          …  
          …

        }
    }
}

4 个答案:

答案 0 :(得分:1)

为了使其工作,您需要一个所有“记录”继承的基本类型。所以称之为Record

public class Record
{
    // some shared properties
}

public class ParamRecord : Record
{
    // param-specific properties
}   

public class MainInfoRecord : Record
{
    // main-specific properties
}   

现在您可以返回List<Record>

答案 1 :(得分:1)

我想告诉你,如果你读到这样的行,你会节省一些内存。

var lines = File.ReadLines(fileName); foreach (var line in lines) // Process line

您可以在What's the fastest way to read a text file line-by-line?上了解详情。

此外,我会将您的方法重命名为ParseFile以避免混淆,并使用@CodeCaster方法创建类层次结构。一旦你有了类层次结构,就可以编写一个可以为你解析的Factory。

答案 2 :(得分:0)

使用List<dynamic>作为返回类型。 例如:

    public static List<dynamic> Parse(string filePath)
{
    string[] lines = File.ReadAllLines(filePath);

    for (int i = 0; i < lines.Length; i++)
    {
        string recordId = lines[i].Substring(0, 2);
        switch (recordId)
        {
            case "00":

                return Parse00(lines[i]).ToList<dynamic>; //public static List<mainInfo> Parse00(string line);

            case "11":

                return Parse11(lines[i]).ToList<dynamic>; //public static List<param> Parse11(string line);

          …  
          …

        }
    }
}

答案 3 :(得分:0)

您需要mainInfoparam - 类继承相同的基类或接口:

interface MyInterface { ... }
class Param : MyInterface { ... }
class MainInfo : MyInterface { ... }

现在您可以返回所需类型的列表:

string recordId = lines[i].Substring(0, 2);
switch (recordId)
{
    case "00":
        return Parse00(lines[i]); //public static List<mainInfo> Parse00(string line);
    case "11":
        return Parse11(lines[i]); //public static List<param> Parse11(string line);

但是,您的方法需要返回Enumerable<MainInfo>IEnumerable<Param>,因为List不是协变,这意味着您无法将List<MainInfo>分配给List<MyInterface>,但是,您可以将前者分配给IEnumerable<MyInterface>,因为IEnumerable是协变的。

最后,由于两个可能的返回值都可以分配给IEnumerable<MyInterface>,因此您可以将其用作Parse方法的返回类型。