System.Array'ın Listeye Dönüştürülmesi


279

Dün gece aşağıdakilerin imkansız olduğunu hayal etmiştim. Ama aynı rüyada, SO'dan biri bana aksini söyledi. Dolayısıyla bunun mümkün dönüştürmek olmadığını bilmek istiyorum System.ArrayiçinList

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);

için

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

2
Aşağıdaki bağlantı, c # codegateway.com/2011/12/…

6
Yayınlamaya var Arrayaslında ne olduğu, bir int[], o zaman kullanabilirsiniz ToList:((int[])ints).ToList();
Tim SCHMELTER

Yanıtlar:


428

Kendinizi biraz acıdan kurtarın ...

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.

Ayrıca sadece ...

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

veya...

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

veya...

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

veya...

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

15
Tamlık için not: 2. yöntem yalnızca C # 3.0+ sürümünde kullanılabilir.
Jon Seigel

21
İnt dizisi zaten uygulandığından IEnumerable<int>, OfType<int>()gerekli değildir. ints.ToList();yeterli.
Heinzi

16
OfType için System.Linq'e ihtiyacınız var
JasonPlutext

11
Bu örneklerin hiçbiri gerçek soruyu cevaplamıyor. Ama sanırım cevabı kabul etti, bu yüzden mutlu oldu. Yine de, bunlardan biri aslında bir Array'ı bir Listeye dönüştürmez. Msgstr "System.Array öğesinin listeye dönüştürülmesi". Tamlık IMO için bu örneği eklemelisiniz. (En iyi cevap olmak ve hepsi)
Søren Ullidtz

4
Enum.GetValues ​​(typeof (Enumtype)). <itemtype> () .ToList ()
Phan Đức Bình

84

List için çalışacak bir yapıcı aşırı yükü de var ... Ama sanırım bu güçlü bir dizi gerektiriyordu.

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

... Array sınıfı için

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);

Bu yaklaşım ile kullanılan yaklaşım arasında ToList()hangisi daha verimli? Yoksa bir fark var mı?
Ben Sutton

1
Gerçek veri kümesi boyutunu bilmeden söylemek zor (Liste dahili olarak genişletilmesi gereken dizileri kullanır. Diziler değişmezdir.) Liste boyutunu önceden bu şekilde biliyorsanız, performansı biraz artırabilir… ama kazanç çok küçük olacak bakımını yapmak istediğiniz sürümü de kullanabilir.
Matthew Whited

3
Bu konunun 6 yaşında olduğunu fark ettiniz mi? (Ve ikinci cevabım Arraybunun yerine kullanma örneğini doğrudan ele alıyor int[].)
Matthew Whited

66

İlginçtir ki kimse soruyu cevaplamıyor, OP güçlü bir şekilde int[]değilArray .

Eğer Arraygerçekte ne olduğunu, bir int[], o zaman kullanabilirsiniz ToList:

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

Not Enumerable.ToListaramalar listesini kurucu denetler bağımsız değişkeni dökülebilir eğer ICollection<T>(ki bir dizi uygular), o zaman daha etkili kullanır ICollection<T>.CopyToyöntemi yerine sekansı sıralandıran.


11
Teşekkürler, Enum.GetValuesbir Dizi döndürür ve bu listeden çıkarmamı sağladı.
Martin Braun

3
Bunun eski olduğunu biliyorum ama haklısın, soru bunun cevabı. Benim durumumda, dinamik bir serileştirici bir sistem dizisi döndürür, çünkü herhangi bir veri türünü kabul etmeye hazırlanmalıdır, böylece çalışma zamanına kadar listeyi önceden yükleyemezsiniz. Teşekkür ederim
Frank Cedeno

27

En basit yöntem:

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

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

veya

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

7
Bir ihtiyacı using System.Linq;için ToList()işe.
Jarekczek

Bu işe yaramıyor Array. Önce yayınlamanız veya aramanız gerekir .Cast<>.
BlueRaja - Danny Pflughoeft

11

Bir dizi diziyi liste olarak döndürmek istediğinizde aşağıdakileri yapabilirsiniz.

using System.Linq;

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

5

Temel olarak bunu yapabilirsiniz:

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

bu sizin dizinizdir ve yeni listenizi şu şekilde arayabilirsiniz:

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

Bunu karmaşık nesne için de yapabilirsiniz.


4

vb.net sadece bunu yapmak

mylist.addrange(intsArray)

veya

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

2
çok daha iyi (bir şey OfType kabul etmeyeceğini ... benim VS2010) OfType <> kullanmak yerine
Woohoo

3

Sadece kodunuzu deneyin verebilirsiniz:

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;

Ardından, kodunuz olarak anyVariable'ı kullanabilirsiniz.


2

Sadece mevcut yöntemi kullanın .. .ToList ();

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

ÖPÜCÜK (BASİT SIR TUTUN)


0

Umarım bu yardımcı olur.

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

dize değeri al

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);

tamsayı değeri al

        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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.