System.Arrayのリストへの変換


278

昨夜、次のことが不可能だと夢見ました。しかし、同じ夢の中で、SOの誰かが別のことを教えてくれました。したがって、私は、それが可能に変換するかどうかを知りたいSystem.ArrayList

Array ints = Array.CreateInstance(typeof(int), 5);
ints.SetValue(10, 0);
ints.SetValue(20, 1);
ints.SetValue(10, 2);
ints.SetValue(34, 3);
ints.SetValue(113, 4);

List<int> lst = ints.OfType<int>(); // not working

2
以下のリンクは、c#codegateway.com

6
あなたはArrayそれを実際にあるものにキャストするint[]必要があります、それからあなたは使うことができますToList((int[])ints).ToList();
Tim Schmelter

回答:


427

自分の痛みを救ってください...

using System.Linq;

int[] ints = new [] { 10, 20, 10, 34, 113 };

List<int> lst = ints.OfType<int>().ToList(); // this isn't going to be fast.

また、ただ...

List<int> lst = new List<int> { 10, 20, 10, 34, 113 };

または...

List<int> lst = new List<int>();
lst.Add(10);
lst.Add(20);
lst.Add(10);
lst.Add(34);
lst.Add(113);

または...

List<int> lst = new List<int>(new int[] { 10, 20, 10, 34, 113 });

または...

var lst = new List<int>();
lst.AddRange(new int[] { 10, 20, 10, 34, 113 });

15
完全性のための注意:2番目の方法はC#3.0以降でのみ使用できます。
Jon Seigel、

21
int配列はすでにを実装しているIEnumerable<int>ため、OfType<int>()は必要ありません。ints.ToList();十分です。
ハインツィ

16
OfTypeのために、あなたはSystem.Linqの必要
JasonPlutext

10
これらの例は、実際の質問に実際に答えるものではありません。しかし、彼は答えを受け入れたので、彼は幸せだったと思います。それでも、これらのいずれも実際に配列をリストに変換しません。「System.ArrayからListへの変換」。完全性IMOのためにその例を追加する必要があります。(トップの答えと、すべてのビーイング)
セーレンUllidtz

3
Enum.GetValues(typeof(Enumtype))。Cast <itemtype>()。ToList()
ファン

84

機能するListのコンストラクタオーバーロードもあります...しかし、これには強力な型付き配列が必要になると思います。

//public List(IEnumerable<T> collection)
var intArray = new[] { 1, 2, 3, 4, 5 };
var list = new List<int>(intArray);

... Arrayクラスの場合

var intArray = Array.CreateInstance(typeof(int), 5);
for (int i = 0; i < 5; i++)
    intArray.SetValue(i, i);
var list = new List<int>((int[])intArray);

このアプローチとを使用するアプローチのToList()どちらがより効率的ですか?または違いはありますか?
Ben Sutton

1
実際のデータセットのサイズがわからないと言うのは難しいです(リストは拡張可能な配列を内部で使用します。配列は不変です)。この方法でリストのサイズを事前に知っていると、パフォーマンスが少し向上する可能性がありますが、ゲインは非常に小さくなります。維持したいバージョンを使用することもできます。
マシューホワイト、2007

3
このスレッドは6年前のものです。(そして、私の2番目の答えは、のArray代わりに使用する彼の例を直接処理しint[]ます。)
Matthew Whited

66

興味深いことに、誰も質問に答えません。OPは強く型付けされint[]たものではなく、を使用していますArray

あなたはArrayそれを実際のものであるにキャストするint[]必要があります、そしてあなたは使うことができますToList

List<int> intList = ((int[])ints).ToList();

は、引数をキャストできる(配列が実装する)かどうかを最初にチェックEnumerable.ToListするリストコンストラクターを呼び出し、シーケンスを列挙する代わりにICollection<T>、より効率的なICollection<T>.CopyToメソッドを使用することに注意してください。


11
ありがとうEnum.GetValues、配列を返します。これは私が配列からリストを作成するのに役立ちました。
Martin Braun

3
私はこれが古いことを知っていますが、あなたは正しいです、質問はこれによる答えです。私の状況では、動的デシリアライザーはシステム配列を返します。システム配列は、あらゆる種類のデータ型を受け入れる準備ができている必要があるため、実行時までリストをプリロードできないためです。ありがとう
フランクセデノ

27

最も簡単な方法は次のとおりです。

int[] ints = new [] { 10, 20, 10, 34, 113 };

List<int> lst = ints.ToList();

または

List<int> lst = new List<int>();
lst.AddRange(ints);

7
働くusing System.Linq;ためToList()に必要なもの。
Jarekczek

10

列挙型の配列をリストとして返したい場合は、次のようにします。

using System.Linq;

public List<DayOfWeek> DaysOfWeek
{
  get
  {
    return Enum.GetValues(typeof(DayOfWeek))
               .OfType<DayOfWeek>()
               .ToList();
  }
}

5

あなたは基本的にこれを行うことができます:

int[] ints = new[] { 10, 20, 10, 34, 113 };

これはあなたの配列であり、次のように新しいリストを呼び出すことができます:

 var newList = new List<int>(ints);

複雑なオブジェクトに対してもこれを行うことができます。


4

vb.netでこれを行うだけです

mylist.addrange(intsArray)

または

Dim mylist As New List(Of Integer)(intsArray)

2
OfType <>を使用するよりもはるかに優れています(私のVS2010は何もOfTypeを受け入れません...)
woohoo

3

あなたはそれをあなたのコードに試させることができます:

Array ints = Array.CreateInstance(typeof(int), 5);
ints.SetValue(10, 0);

ints.SetValue(20, 1);
ints.SetValue(10, 2);
ints.SetValue(34, 3);
ints.SetValue(113, 4);

int[] anyVariable=(int[])ints;

次に、anyVariableをコードとして使用できます。


2

既存のメソッドを使用するだけです。.ToList();

   List<int> listArray = array.ToList();

KISS(KEEP IT SIMPLE SIR)


0

これがお役に立てば幸いです。

enum TESTENUM
    {
        T1 = 0,
        T2 = 1,
        T3 = 2,
        T4 = 3
    }

文字列値を取得する

string enumValueString = "T1";

        List<string> stringValueList =  typeof(TESTENUM).GetEnumValues().Cast<object>().Select(m => 
            Convert.ToString(m)
            ).ToList();

        if(!stringValueList.Exists(m => m == enumValueString))
        {
            throw new Exception("cannot find type");
        }

        TESTENUM testEnumValueConvertString;
        Enum.TryParse<TESTENUM>(enumValueString, out testEnumValueConvertString);

整数値を取得

        int enumValueInt = 1;

        List<int> enumValueIntList =  typeof(TESTENUM).GetEnumValues().Cast<object>().Select(m =>
            Convert.ToInt32(m)
            ).ToList();

        if(!enumValueIntList.Exists(m => m == enumValueInt))
        {
            throw new Exception("cannot find type");
        }

        TESTENUM testEnumValueConvertInt;
        Enum.TryParse<TESTENUM>(enumValueString, out testEnumValueConvertInt);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.