リスト<MyClass>のToString()をオーバーライドします -- c# フィールド と string フィールド と extension-methods フィールド と overriding フィールド と tostring フィールド 関連 問題

Overriding ToString() of List<MyClass>












25
vote

問題

日本語

クラスのMyClassを持っていて、リストのインスタンスのToString()のメソッドをオーバーライドしたいと思います。

<事前> <コード> class MyClass { public string Property1 { get; set; } public int Property2 { get; set; } /* ... */ public override string ToString() { return Property1.ToString() + "-" + Property2.ToString(); } }

次のことをお願いします。

<事前> <コード> var list = new List<MyClass> { new MyClass { Property1 = "A", Property2 = 1 }, new MyClass { Property1 = "Z", Property2 = 2 }, }; Console.WriteLine(list.ToString()); /* prints: A-1,Z-2 */

そうすることは可能ですか?または私はリスト&lt; myclass&gtをサブクラス化する必要があります。 MyサブクラスのメソッドtoString()をオーバーライドするには?拡張方法を使用してこの問題を解決することができます(つまり、拡張方法でメソッドをオーバーライドすることは可能です)?

ありがとう!

英語

I have a class MyClass, and I would like to override the method ToString() of instances of List:

class MyClass {     public string Property1 { get; set; }     public int Property2 { get; set; }     /* ... */     public override string ToString()     {         return Property1.ToString() + "-" + Property2.ToString();     } } 

I would like to have the following:

var list = new List<MyClass>             {                 new MyClass { Property1 = "A", Property2 = 1 },                 new MyClass { Property1 = "Z", Property2 = 2 },             };  Console.WriteLine(list.ToString());   /* prints: A-1,Z-2 */ 

Is it possible to do so? Or I would have to subclass List<MyClass> to override the method ToString() in my subclass? Can I solve this problem using extension methods (ie, is it possible to override a method with an extension method)?

Thanks!

</div
              
 
 

回答リスト

25
 
vote
vote
ベストアンサー
 

メソッドをオーバーライドするためにサブクラスをサブクラスにする必要があります。ジェネリック人のポイントは、Tの種類に関係なく同じ振る舞いが必要なと言うことです。特定の種類の異なる動作が必要な場合は、その契約を壊して自分のクラスを書く必要があります。

<事前> <コード> public class MyTypeList : List<MyClass> { public override string ToString() { return ... } }

追加編集:

いいえ、拡張子を作成することでメソッドを上書きすることはできませんが、このリストタイプに固有の異なる署名を持つ新しいメソッドを作成することができます。

<事前> <コード> public static string ExtendedToString(this List<MyClass> list) { return .... }

で使用します <事前> <コード> List<MyClass> myClassList = new List<MyClass> string output = myClassList.ExtendedToString();

私はまだあなたがサブクラスをオフにしていますが...

 

You'll need to subclass to override any method. The point of generics is to say that you want the same behaviour regardless of the type of T. If you want different behaviour for a specific type of T then you are breaking that contract and will need to write your own class:

public class MyTypeList : List<MyClass> {     public override string ToString()     {         return ...     } } 

Edited to add:

No, you can't override a method by creating an extension, but you could create a new method with a different signature that is specific to this list type:

public static string ExtendedToString(this List<MyClass> list) {      return .... }  

Used with

List<MyClass> myClassList = new List<MyClass> string output = myClassList.ExtendedToString(); 

I still think you're better off subclassing though...

</div
 
 
   
   
27
 
vote

おそらくビットオフトピックですが、<コード> ToDelimitedString 拡張方法は <Extension()> _ Public Function ToString(ByVal source As Generic.List(Of Char)) As String Return String.Join(separator:="", values:=source.ToArray) End Function に機能します。使用する区切り文字を(オプションで)指定する区切り文字を指定し、各要素に対してカスタム文字列変換を実行するための代理人を指定できます。

<事前> <コード> // if you've already overridden ToString in your MyClass object... Console.WriteLine(list.ToDelimitedString()); // if you don't have a custom ToString method in your MyClass object... Console.WriteLine(list.ToDelimitedString(x => x.Property1 + "-" + x.Property2)); // ... public static class MyExtensionMethods { public static string ToDelimitedString<T>(this IEnumerable<T> source) { return source.ToDelimitedString(x => x.ToString(), CultureInfo.CurrentCulture.TextInfo.ListSeparator); } public static string ToDelimitedString<T>( this IEnumerable<T> source, Func<T, string> converter) { return source.ToDelimitedString(converter, CultureInfo.CurrentCulture.TextInfo.ListSeparator); } public static string ToDelimitedString<T>( this IEnumerable<T> source, string separator) { return source.ToDelimitedString(x => x.ToString(), separator); } public static string ToDelimitedString<T>(this IEnumerable<T> source, Func<T, string> converter, string separator) { return string.Join(separator, source.Select(converter).ToArray()); } }
 

Perhaps a bit off-topic, but I use a ToDelimitedString extension method which works for any IEnumerable<T>. You can (optionally) specify the delimiter to use and a delegate to perform a custom string conversion for each element:

// if you've already overridden ToString in your MyClass object... Console.WriteLine(list.ToDelimitedString()); // if you don't have a custom ToString method in your MyClass object... Console.WriteLine(list.ToDelimitedString(x => x.Property1 + "-" + x.Property2));  // ...  public static class MyExtensionMethods {     public static string ToDelimitedString<T>(this IEnumerable<T> source)     {         return source.ToDelimitedString(x => x.ToString(),             CultureInfo.CurrentCulture.TextInfo.ListSeparator);     }      public static string ToDelimitedString<T>(         this IEnumerable<T> source, Func<T, string> converter)     {         return source.ToDelimitedString(converter,             CultureInfo.CurrentCulture.TextInfo.ListSeparator);     }      public static string ToDelimitedString<T>(         this IEnumerable<T> source, string separator)     {         return source.ToDelimitedString(x => x.ToString(), separator);     }      public static string ToDelimitedString<T>(this IEnumerable<T> source,         Func<T, string> converter, string separator)     {         return string.Join(separator, source.Select(converter).ToArray());     } } 
</div
 
 
     
     
3
 
vote

実際にはUnicode Trickを使用して、汎用リストに対して直接代替のToStringメソッドを直接定義できます。

Visual Studioに入力された文字入力を有効にすると、Altキーを押しながら目に見えない文字を作成してから、数字キーパッド+ f F F F F F F F F F F F F F F(現在リリースAlt)

だから私たちはその名前の横にある目に見えない文字を使って次の関数を作成することができます...(VBコードを知っていますが、概念はまだC#のために機能します)

<事前> <コード> <Extension()> _ Public Function ToString(ByVal source As Generic.List(Of Char)) As String Return String.Join(separator:="", values:=source.ToArray) End Function

Visual Studioでは、あなたがあなたのリストに対してIntelliSenseにアクセスすると、標準のToStringまたはあなたのカスタム関数の間で選択することができます。


Visual Studioに16進文字入力を有効にするには、レジストリを編集する必要があるかもしれません

オープンHKEY_CURRENT_USER Control Panel Inputメソッド enableHexnumpadというreg_szを作成するreg_szを1

に設定します。

&ampを無効にする必要があります。ファイル、編集、デバッグ、データメニューのショートカット、 Visual Studioで、[ツール]メニューを開き、[カスタマイズ]を選択し、[コマンド]タブを開き、[選択]ボタンを使用して、&AMPを削除して、ショートカットのいずれかのABCDEFチャラクを使用するメニュー項目を使用します。

それ以外の場合は、16進文字を入力するのではなく、ポップアップメニューを開くことになります。

 

You can actually use a unicode trick to allow you to define an alternate ToString method directly against your generic list.

If you enable hex character input into visual studio then you can create invisible characters by holding down the Alt key, then pressing the following on your numeric keypad + F F F 9 (now release Alt)

So we can create the following function with an invisible character placed next to its name... (yes i know its VB code, but the concept will still work work for C#)

<Extension()> _ Public Function ToString(ByVal source As Generic.List(Of Char)) As String    Return String.Join(separator:="", values:=source.ToArray) End Function 

Now in visual studio, when you access intellisense against your list, you will be able to choose between either the standard ToString or your custom function.


To enable hex character input into visual studio you may need to edit your registry

open HKEY_CURRENT_USERControl PanelInput Method and create a REG_SZ called EnableHexNumpad set this to 1

You will also need to disable the & shortcuts for the File, Edit, Debug, Data menus, In visual studio, open the tools menu, select customize, then open the commands tab, and using the modify selection button for any menu item that uses either of the ABCDEF charactes for its short cut, by removing the &

Otherwise you will end up opening popup menus, instead of typing hex characters.

</div
 
 
 
 
2
 
vote

メソッドを ToString という名前の場合は、 List からクラスを導出する必要があります。あなたはそれを一般的なものにすることができます:

<事前> <コード> static class MyList<T> : List<T> { public override string ToString() { // ... } }

カスタム変換をお持ちの場合は、アプリケーション全体で 998877611 の代わりに public static string ExtendedToString(this List<MyClass> list) { return .... } 0 を使用する必要があります。

しかし、メソッドに別の名前を選択できる場合は、拡張方法を使用して同じ効果を得ることができます。

拡張方法を使用してこれをより一般的にする:

<事前> <コード> public static string ExtendedToString(this List<MyClass> list) { return .... } 2

public static string ExtendedToString(this List<MyClass> list) { return .... } 3 の任意のインスタンスでは、通常のメソッドのように使用できます。

<事前> <コード> public static string ExtendedToString(this List<MyClass> list) { return .... } 4
 

If you method must be named ToString you will have to derive a class from List. You can make it a generic:

static class MyList<T> : List<T> {     public override string ToString()     {         // ...     } } 

In this case, you would have to use MyList instead of List throughout your application if you wish to have your custom conversion.

However, if you can choose a different name for your method, you can use extension methods and achieve the same effect, with almost no modifications to your code:

You can use extension methods to make this more generic:

static class ListExtension {     public static void ConvertToString<T>(this IEnumerable<T> items)     {         // ...     } } 

You can use it on any instance of IEnumerable<T> just as if it were an ordinary method:

List<MyClass> list = new List<MyClass> { ... }; Console.WriteLine(list.ConvertToString());  int[] array_of_ints = {1,2,3,4,5}; Console.WriteLine(array_of_ints.ConvertToString()); 
</div
 
 
0
 
vote

コレクションから継承し、そのクラスのtoString()メソッドを具体的に上書きする独自のカスタムクラスを作成する必要があります。

 

You would have to create your own custom class that inherits from Collection and then overwride the ToString() method of that class specifically.

</div
 
 
0
 
vote

いいえそれは不可能です。 TlistのToStringはリストオブジェクトの文字列表現を与えます。

あなたのオプションは次のとおりです。

  • tlistから派生し、あなたが言及したように.toString()メソッドをオーバーライドします。 (この例では、その価値があるとは言わないだろう)
  • TLISTリストをコンマ区切り文字列に変換するヘルパーメソッドを作成します。拡張方法(おそらく最良の提案)
  • コンソールでforeachステートメントを使用してください。

助けを願っています!

 

No its not possible. ToString of TList will give you the string representation of the list object.

Your options are:

  • Derive from TList and override the .ToString() method as you mentioned. (in this example I wouldn't say its worth doing so)
  • Create a helper method that converts a TList list to a comma delimited string e.g. extension method (probably best suggestion)
  • Use a foreach statement at the Console.WriteLine stage.

Hope that helps!

</div
 
 
0
 
vote

あなたが List<T>.ToString() を上書きするためにあなたが持っている正確な理由に応じて、注文 <コード> TypeConverter 実装

特定の List<T> List<T> string を使用して、TypeConvertersが使用されている場所で string を表示する場合デバッガまたは string.Format("List: {0}", listVariable) 型の状況では、これで十分かもしれません。

TypeConverter の存在について知らずに、 TypeConverter と使用されている場所を知らずに、その結​​果を変更したいと思っていただけです。私は、それらが定義されているタイプを string に変換するときに、既定のTypeConvertersの既定のtypeconvertersの多数/ほとんど/すべて(どちらはわからない?)を信じています。 Plain

 

Depending on the exact reason you have for wanting to override List<T>.ToString() to return something specific it might be handy to have a look at custom TypeConverter implementations.

If you simply want a List<T> of specific T to show itself a certain way as a string in locations where TypeConverters are used, like in the debugger or in string.Format("List: {0}", listVariable) type situations, this might be enough.

You might just have seen the result of ToString() being shown somewhere and wanted to change that, without knowing about the existence of TypeConverter and locations where they are used. I believe many/most/all (not sure which?) of the default TypeConverters in the .NET Framework simply use ToString() when converting any type for which they are defined for to a string.

</div
 
 

関連する質問

0  DBPedialookupクライアント  ( Dbpedialookup client ) 
DBPEDIAルックアップサービスを使用しようとしている Georgi Kobililov 。 <事前> <コード> DBpediaLookupClient dbpedialookup = new DBpediaLookupClient("Car"); S...

1  ToString(..)での現在の文化を避ける  ( Avoid current culture in tostring ) 
指定された表示形式ごとに10進値を設定する必要があります。 <コード> "decimalValue.ToString("##,##,##,##,##,##,###")" 以下のコードでは、現在のアプリケーション文化を内部的に内部的にもフォーマット値を考慮してい...

3  Android / Javaは、割り当てなしでintからstringへの変換?  ( Android java converting from int to string without allocations ) 
Android用のアプリの1つのコースのどちらかを繰り返し繰り返し弦に変換しなければならないことを考えました。 Integer.toString()などの関数呼び出しのために表示できない潜在的な変数の割り当てが軽減されるだろうと思う小さなユーティリティクラス...

0  ToString()出力を変更する方法  ( How to change my tostring output ) 
現在 toString() メソッドは、オブジェクトの内部識別子を表示します。 代わりに toString() メソッドの表示オブジェクト変数の表示方法は? ありがとう! ...

0  ToString、NullPointerException  ( Tostring nullpointerexception ) 
ArrayListからツリー名を取得しようとしているときにNullPointerExceptionを取得しています。私は単独で名前を取得するだけでテストしましたが、まだこのエラーを得ています。私がやりたいのはどの機材を切削しているのかを知っています。 <事前...

6  Android + ToString  ( Android tostring ) 
誰かがAndroidの何のためのものであるか、そしてそれがどのように使用できるかを教えてください。 例として高く評価されています。 ...

0  Call.Prototype.toStringとの有無にかかわらず  ( Object prototype tostring with and without call ) 
誰かが次のような結果を生み出す理由を説明してください。私はこれを研究しようとしましたが、まだ良い説明が見つかりません。 Object.PrototypeのToStringの呼び出し1プロダクション: <事前> <コード> Object.prototype.t...

1  Public Override String ToString、ArrayListおよびListboxの出力は、マルチプライラインで出力されますか?  ( Public override string tostring arraylist and listbox output in multiplelines ) 
私は一晩中このC#問題に苦しんでいます。 私は上書きToString()を持っています。これは細かく機能しています、そして私はリストボックスに私のデータを置くことができます。しかし、データが非常に長いため、クラスの束があると、出力が長くなります。 私はリスト...

0  DateTime Milliseconds DataGridViewセル値  ( Datetime milliseconds datagridview cell value to string ) 
私はクエリから日付を持つC#にDataGridViewを持っています、私はDataGridViewで、 "dd / mm / yyyy h:mm:ss.fff tt"の形式を使いました "2015/12/12/12 :23:39.343 PM " しかし私がこ...

0  参照タイプでTOSTRING()を呼び出す[閉じる]  ( Calling tostring on a reference type ) 
ここで尋ねられていることを知るのは難しいです。この問題はあいまい、曖昧で、不完全で、過度に広く、または修辞的であり、現在の形で合理的に回答することはできません。再開できるようにこの質問を...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有