2017-07-27 47 views
0

如何以一種方法返回不同的對象列表?我有一些方法,返回一些類型的列表,我不知道是什麼解析方法應該返回用一種方法返回不同的列表C#

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

      … 
      … 

     } 
    } 
} 
+0

'mainInfo'從'param'繼承,反之亦然,還是繼承自一些常見類型? –

+0

@ LasseV.Karlsen,沒有在DB –

+0

有不同的表格你想要做什麼?在你的例子中,你只返回第一行。我假設你想分析所有的行,對吧? – Ben

回答

1

爲了這個工作,你需要一個基本類型,所有的「記錄」繼承從。所以叫它Record

public class Record 
{ 
    // some shared properties 
} 

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

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

現在你可以返回List<Record>

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

      … 
      … 

     } 
    } 
} 
+0

無法將類型'System.Collections.Generic.List '隱式轉換爲'System.Collections.Generic.List ' –

+0

如果這是要走的路,您將不得不構建一個新列表並添加從更具體的列表中的所有項目進入這個更開放的列表。你不能施放。例如:'return xyz.ToList ();' –

+0

return Parse00(lines [i])。ToList (); – tech2avinash

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不適合cova這意味着你不能指定List<MainInfo>List<MyInterface>,但是你可以指定前者爲IEnumerable<MyInterface>,因爲IEnumerable是協變的。

最後,因爲兩個可能的返回值都可分配給IEnumerable<MyInterface>,所以您可以將其用作Parse-方法的返回類型。

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方法創建類層次結構。一旦你有類層次結構,你可以編寫一個工廠來爲你解析。

相關問題