web-dev-qa-db-ja.com

System.Arrayをstring []に変換します

String []に変換する必要があるSystem.Arrayがあります。これを行うには、配列をループして各要素でToStringを呼び出し、string []に保存するよりも良い方法はありますか?問題は、実行時まで要素のタイプが必ずしもわからないことです。

40
KrisTrip

LINQを使用してはどうですか?

string[] foo = someObjectArray.OfType<object>().Select(o => o.ToString()).ToArray();
66
Craig Stuntz

ただArrayですか?または、(たとえば)object[]ですか?その場合:

object[] arr = ...
string[] strings = Array.ConvertAll<object, string>(arr, Convert.ToString);

参照型の1-d配列はobject[](実際にはFoo[]であっても)にキャスト可能である必要がありますが、値型(int[]など)することはできません。だからあなたは試すことができます:

Array a = ...
object[] arr = (object[]) a;
string[] strings = Array.ConvertAll<object, string>(arr, Convert.ToString);

ただし、int[]のような場合は、手動でループする必要があります。

13
Marc Gravell

次のようにArray.ConvertAllを使用できます。

string[] strp = Array.ConvertAll<int, string>(arr, Convert.ToString);
4
Amit Degadwala

シンプルで基本的なアプローチ。

Array personNames = Array.CreateInstance(typeof (string), 3);
// or Array personNames = new string[3];
personNames.SetValue("Ally", 0);
personNames.SetValue("Eloise", 1);
personNames.SetValue("John", 2);

string[] names = (string[]) personNames; 
// or string[] names = personNames as string[]

foreach (string name in names)
    Console.WriteLine(name);

または単に別のアプローチ:personNames.ToArrayも使用できます:

string[] names = (string[]) personNames.ToArray(typeof (string));
1
Umut D.

これはおそらく圧縮できますが、System.ArrayタイプのオブジェクトでCast <>またはLinq Selectを使用できないという制限を回避します。

Type myType = MethodToGetMyEnumType();
Array enumValuesArray = Enum.GetValues(myType);
object[] objectValues new object[enumValuesArray.Length];
Array.Copy(enumValuesArray, objectValues, enumValuesArray.Length);

var correctTypeIEnumerable = objectValues.Select(x => Convert.ChangeType(x, t));
0
bougiefever