2010-10-04 73 views
2

我知道我可以通過創建自定義類來解決以下問題,但是可以強制輸入List(或任何其他類型)?這可能使用泛型? c#

var x = new object[] 
     { 
      new object[] { new Image(), new TextBox(), new FileUpload() }, 
      new object[] { new Image(), new TextBox() , new FileUpload()} 
     }; 

上面的代碼中的對象類型就是例子。

這是一天的結束,我的大腦已經變得軟弱。

編輯:元組?

回答

8

是的,通用的元組將工作:

http://sankarsan.wordpress.com/2009/11/29/tuple-in-c-4-0/

var myTuples = new List<Tuple<type1, type2, type3>>(); 
+0

不錯!另一個爲什麼我喜歡瀏覽計算器的例子...每天學習新的東西。永遠不知道元組... – 2010-10-04 17:00:04

4
var x = new []   
{    
    new 
    { 
     Image = new Image(), 
     TextBox = new TextBox(), 
     FileUpload = new FileUpload() 
    }, 
    new 
    { 
     Image = new Image(), 
     TextBox = new TextBox(), 
     FileUpload = new FileUpload() 
    }   
}; 
+1

儘管子陣列會更好,例如,新{Image = ...,TextBox = ... etc – 2010-10-04 16:25:13

+0

是的,我正在嘗試編輯,以添加...代碼格式化程序似乎相當破碎...每當我想添加代碼,它堅持佔位符某處我不'不想要它。 – 2010-10-04 16:28:23

1

沒有指定,但它看起來像您使用的System.Web程序的類型?如果是這樣,那麼是泛型可以用來創建一個更強類型的集合。例如

List<List<WebControl>> list = new List<List<WebControl>>(); 
list.Add(new List<WebControl>(new WebControl()[] new Image(), new TextBox(), new FileUpload 
()); 
list.Add(new List<WebControl>(new WebControl()[] new Image(), new TextBox(), new FileUpload()); 

爲了得到一個非常強類型集合,雖然你需要導致對Tuple<>或匿名類型的解決方案。

1

你可以像你說的那樣使用Tuple。或匿名類型:

var x = new[] 
    { 
     new { Image = new Image(), TextBox = new TextBox(), FileUpload = new FileUpload() }, 
     new { Image = new Image(), TextBox = new TextBox(), FileUpload = new FileUpload() } 
    }; 
0

一個Tuple<Image, TextBox, FileUpload>[]或許List<Tuple<Image, TextBox, FileUpload>>會做的伎倆,如果你使用的是框架4.

否則,你可以使用匿名類型,但它可以是尷尬超出了(因爲你可以在有用的情況下,不要聲明該類型)。

最後,它不是最簡單的結構,只是推出自己的。

1

匿名對象強類型。 唯一值得關注的是,您無法知道型號名稱(不是直接)。

取本示例(抱歉,如果它太長):

 static void T2() 
    { 
     var x = new 
     { 
      a = new { a1 = new Type1("x.1"), a2 = new Type2(1), a3 = new Type3('1') }, 
      b = new { b1 = new Type1("x.2"), b2 = new Type2(2), b3 = new Type3('2') } 
     }; 

     var y = new 
     { 
      a = new { a1 = new Type1("y.1"), a2 = new Type2(1), a3 = new Type3('1') }, 
      b = new { b1 = new Type1("y.2"), b2 = new Type2(2), b3 = new Type3('2') } 
     }; 

     var z = new 
     { 
      a = new { a1 = new Type1("y.1"), a2 = new Type3('1') }, 
      b = new { b1 = new Type3('z'), b2 = new Type2(2) } 
     }; 

     Console.WriteLine(new string('-', 40)); 
     Console.WriteLine("Anonymous object \"x\" is named {0}.", x.GetType()); 
     Console.WriteLine("Anonymous object \"y\" is named {0}.", y.GetType()); 
     Console.WriteLine("Anonymous object \"z\" is named {0}.", z.GetType()); 

     Console.WriteLine(new string('-', 40)); 
     Console.Write("Anonymous object \"x\" == \"y\"? "); 
     Console.WriteLine(x.Equals(y) ? "Yes" : "No"); 

     Console.Write("Anonymous object \"x\" == \"z\"? "); 
     Console.WriteLine(x.Equals(z) ? "Yes" : "No"); 

     var x2 = new 
     { 
      a = new { a1 = new Type1("x.1"), a2 = new Type2(1), a3 = new Type3('1') }, 
      b = new { b1 = new Type1("x.2"), b2 = new Type2(2), b3 = new Type3('2') } 
     }; 

     Console.Write("Anonymous object \"x\" == \"x2\"? "); 
     Console.WriteLine(x.Equals(x2) ? "Yes" : "No"); 

     // Uncomment it to give: 
     //Error 1 Cannot implicitly convert type 'AnonymousType#1' to 'AnonymousType#2' 
#if GiveMeAnError 
     z = new 
     { 
      a = new { a1 = new Type1("z.1"), a2 = new Type2(1), a3 = new Type3('1') }, 
      b = new { b1 = new Type1("z.2"), b2 = new Type2(2), b3 = new Type3('2') } 
     }; 

     Console.WriteLine("Anonymous object \"z\" now is named {0}.", z.GetType()); 

     Console.Write("Anonymous object \"x\" == \"z\"? "); 
     Console.WriteLine(x.Equals(z) ? "Yes" : "No"); 
#endif 
     Console.ReadKey(); 
    } 

它輸出:

/*---------------------------------------- 
Anonymous object "x" is named <>f__AnonymousType2`2[<>f__AnonymousType0`3 [anon_obj.Type1,anon_obj.Type2,anon_obj.Type3],<>f__AnonymousType1`3[anon_obj.Type1,anon_obj.Type2,anon_obj.Type3]]. 
Anonymous object "y" is named <>f__AnonymousType2`2[<>f__AnonymousType0`3[anon_obj.Type1,anon_obj.Type2,anon_obj.Type3],<>f__AnonymousType1`3[anon_obj.Type1,anon_obj.Type2,anon_obj.Type3]]. 
Anonymous object "z" is named <>f__AnonymousType2`2[<>f__AnonymousType3`2[anon_obj.Type1,anon_obj.Type3],<>f__AnonymousType4`2[anon_obj.Type3,anon_obj.Type2]]. 
---------------------------------------- 
Anonymous object "x" == "y"? No 
Anonymous object "x" == "z"? No 
Anonymous object "x" == "x2"? Yes*/ 

每個匿名對象組合物具有其自己的名稱和定義了一個獨特的類型。 使用相同類型和類型名稱聲明的對象轉到相同類型,如「x == x2」中所示。

儘管原始的例子很棘手,因爲它定義了「object []」數組中的「object []」數組。 這樣

  var x = new object[ ] 
     { 
      new object[] { new Type1("x.1"), new Type2(1), new Type3('1') }, 
      new object[] { new Type1("x.2"), new Type2(2) , new Type3('2')} 
     }; 

     var y = new object[ ] 
     { 
      new object[] { new Type1("y.1"), new Type2(1), new Type3('1') }, 
      new object[] { new Type1("y.2"), new Type2(2) , new Type3('2')} 
     }; 

     var z = new object[ ] 
     { 
      new object[] { new Type1("y.1"), new Type3('1') }, 
      new object[] { new Type3('z'), new Type2(2)} 
     }; 

將全部被同一類型(對象[]),並且比較將永諾通過比較指針,這將完成,hopefuly,有所不同。

 static void T1() 
    { 
     var x = new object[ ] 
     { 
      new object[] { new Type1("x.1"), new Type2(1), new Type3('1') }, 
      new object[] { new Type1("x.2"), new Type2(2) , new Type3('2')} 
     }; 

     var y = new object[ ] 
     { 
      new object[] { new Type1("y.1"), new Type2(1), new Type3('1') }, 
      new object[] { new Type1("y.2"), new Type2(2) , new Type3('2')} 
     }; 

     var z = new object[ ] 
     { 
      new object[] { new Type1("y.1"), new Type3('1') }, 
      new object[] { new Type3('z'), new Type2(2)} 
     }; 

     Console.WriteLine(new string('-', 40)); 
     Console.WriteLine("Anonymous object \"x\" is named {0}.", x.GetType()); 
     Console.WriteLine("Anonymous object \"y\" is named {0}.", y.GetType()); 
     Console.WriteLine("Anonymous object \"z\" is named {0}.", z.GetType()); 


     Console.WriteLine(new string('-', 40)); 
     Console.Write("Anonymous object \"x\" == \"y\"? "); 
     Console.WriteLine(x.Equals(y) ? "Yes" : "No"); 

     Console.Write("Anonymous object \"x\" == \"z\"? "); 
     Console.WriteLine(x.Equals(z) ? "Yes" : "No"); 

     var x2 = new object[ ] 
     { 
      new object[] { new Type1("x.1"), new Type2(1), new Type3('1') }, 
      new object[] { new Type1("x.2"), new Type2(2) , new Type3('2')} 
     }; 

     Console.Write("Anonymous object \"x\" == \"x2\"? "); 
     Console.WriteLine(x.Equals(x2) ? "Yes" : "No"); 

     z = new object[ ] 
     { 
      new object[] { new Type1("x.1"), new Type2(1), new Type3('1') }, 
      new object[] { new Type1("x.2"), new Type2(2) , new Type3('2')} 
     }; 

     Console.WriteLine("Anonymous object \"z\" now is named {0}.", z.GetType()); 


     Console.Write("Anonymous object \"x\" == \"z\"? "); 
     Console.WriteLine(x.Equals(z) ? "Yes" : "No"); 

     Console.Write("Anonymous object \"x\" == \"z\" (memberwise)? "); 
     Console.WriteLine(
      x[ 0 ].Equals(z[ 0 ]) 
      && x[ 1 ].Equals(z[ 1 ]) 
      ? "Yes" : "No"); 

     Console.ReadKey(); 
    } 

將輸出:

/*---------------------------------------- 
Anonymous object "x" is named System.Object[]. 
Anonymous object "y" is named System.Object[]. 
Anonymous object "z" is named System.Object[]. 
---------------------------------------- 
Anonymous object "x" == "y"? No 
Anonymous object "x" == "z"? No 
Anonymous object "x" == "x2"? No 
Anonymous object "z" now is named System.Object[]. 
Anonymous object "x" == "z"? No 
Anonymous object "x" == "z" (memberwise)? No 
----------------------------------------*/ 

查看疑難雜症?