2013-04-24 44 views
0

我試圖找到重構我的代碼的方式,但不知道如何做到這一點。C#使用設計模式重構不同細節的相同動作

例如,我們有幾類

class A { 
    string name; 
    int year; 
} 

class B { 
     long id; 
     string code; 
     DateTime currentTime; 
} 

class C { 
     string lastname; 
     DateTime currentDate; 
} 

而後者我需要回到這些類列表,列表,列表中的對象列表,並將它們轉換成對象[] []。

對於每一個轉換我做同樣的

private Object[][] converAListToObjectArray(List<A> dataList) 
     { 
      long countRecords = dataList.Count(); 
      const int countProperty = 2; 
      var arrayRes = new object[countRecords][]; 

      for (int i = 0; i < countRecords; i++) 
      { 
       var arrayObjProperty = new object[countProperty]; 
       arrayObjProperty[0] = dataList[i].Name; 
       arrayObjProperty[1] = dataList[i].Year; 

       arrayRes[i] = arrayObjProperty; 
      } 
      return arrayRes; 
     } 

private Object[][] converBListToObjectArray(List<B> dataList) 
     { 
      long countRecords = dataList.Count(); 
      const int countProperty = 3; 
      var arrayRes = new object[countRecords][]; 

      for (int i = 0; i < countRecords; i++) 
      { 
       var arrayObjProperty = new object[countProperty]; 
       arrayObjProperty[0] = dataList[i].Id; 
       arrayObjProperty[1] = dataList[i].Code; 
       arrayObjProperty[2] = dataList[i].CurrentTime; 

       arrayRes[i] = arrayObjProperty; 
      } 
      return arrayRes; 
     } 

是否有可能單獨此皈依使用一些設計模式?

+0

它不清楚你正試圖在這裏完成的..你試圖獲得一個通用的轉換列表到2D數組函數? – Sayse 2013-04-24 20:16:54

+0

@Sayse我嘗試創建統一的功能,將列表中的任何對象轉換爲2d數組 – Ray 2013-04-24 20:22:40

+0

爲什麼你想這樣做? – sidesinger 2013-04-24 20:25:31

回答

1

你可以使用一個動作,做這樣的事情: -

class Program 
{ 
    // Your new function, (doesn't have to be static; just did it for the demo) 
    // If you really really want to return object[][] still, 
    // You'll need to pass an index to foo as well 
    private static List<IList<object>> convert<T>(IList<T> dataList, Action<IList<object>, T> foo) 
    { 
     var arrayRes = new List<IList<object>>(); 

     foreach (var item in dataList) 
     { 
      var arrayObjProperty = new List<object>(); 
      foo(arrayObjProperty, item); 

      arrayRes.Add(arrayObjProperty); 
     } 
     return arrayRes; 
    } 

    // The rest is just calling the function with two examples 
    static void Main(string[] args) 
    { 
     var bar = new List<A>(); 
     bar.Add(new A() { name = "qux", year = 2013 }); 

     var objects1 = convert(bar, (a, b) => 
     { 
      a.Add(b.name); 
      a.Add(b.year); 
     }); 

     var baz = new List<B>(); 
     baz.Add(new B() { code = "qux", id = 2013 }); 

     var objects2 = convert(baz, (a, b) => 
     { 
      a.Add(b.code); 
      a.Add(b.id); 
     }); 
    } 
} 

你可以只這個複製到你的IDE有一齣戲,看看它是如何工作的。基本上,這使用泛型,然後是一個動作,以允許您執行每次在傳遞給該方法的lambda中不同的唯一部分。

0

你可以簡化和使用這樣的東西 - 例如對於B ...

List<B> list = new List<B> 
{ 
    new B{ id = 1, code = "", currentTime = DateTime.Now}, 
    new B{ id = 1, code = "", currentTime = DateTime.Now}, 
    new B{ id = 1, code = "", currentTime = DateTime.Now}, 
}; 

var array = list.Select(x => new object[] { x.id, x.code, x.currentTime }).ToArray(); 
3

您可以編寫一個通用函數,它使用反射來獲取每個對象的字段名稱和值。你需要決定它是否適用於公共或私人領域。下面的例子抓住公共和私人領域:

static object[][] ConvertToObjectArray<T>(IList<T> objects) 
{ 
    var fields = (from fieldInfo in typeof(T).GetFields(
     System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance) 
        orderby fieldInfo.Name 
        select fieldInfo).ToArray(); 

    object[][] table = new object[objects.Count][]; 
    for (int i = 0; i < table.Length; i++) 
    { 
     table[i] = (from fieldInfo in fields 
        select fieldInfo.GetValue(objects[i])).ToArray(); 
    } 
    return table; 
} 
+0

這就是我的想法,但我真的質疑用例在這裏。 – sidesinger 2013-04-24 20:42:12

0

Object[][]結構是有點不尋常,以我的眼睛。你知道有列表的Cast方法嗎?

你可以做到以下幾點:

List<A> foo = new List<A>(); 

// initialize foo here 
var bar = foo.Cast<Object>().ToArray(); 

這將讓你與你的完整字段名稱的對象數組。如果你絕對需要有領域的數組元素(你爲什麼要這樣),你可以添加一個ToObject方法,每個類的:

class A 
{ 
    public string name; 
    public int year; 
    public Object[] ToObject() 
    { 
     return new Object[] {name, year}; 
    } 
} 


    List<A> foo = new List<A> 
    { 
     new A{name="reacher",year=2013}, 
     new A{name="Ray",year=2013} 
    }; 
    var bux = foo.Select(a => a.ToObject()).ToArray() ; 
+0

我需要在Excel中填寫數據範圍 – Ray 2013-04-24 20:30:58

+0

這不是Ray的解決方案。 Ray還希望將這些屬性轉換爲對象數組。 – 2013-04-24 20:38:47

+0

我會傾向於不同意你,馬丁。第二個例子可以讓Ray編寫'bux [0] [0]'等等,這似乎滿足了他的要求。你能幫我理解你爲什麼會這麼想嗎? – 2013-04-24 20:48:44

相關問題