Chuyển đổi System.Array thành Danh sách


278

Đêm qua tôi đã mơ rằng những điều sau đây là không thể. Nhưng trong cùng một giấc mơ, ai đó từ SO đã nói với tôi điều khác. Do đó tôi muốn biết nếu có thể chuyển đổi System.ArraythànhList

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

đến

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

2
Liên kết bên dưới hiển thị cách thức hoạt động trong c # codegateway.com/2011/12/ trên

6
Bạn phải sử dụng đúng Arraynhư vậy, an int[], sau đó bạn có thể sử dụng ToList:((int[])ints).ToList();
Tim Schmelter

Câu trả lời:


427

Hãy tự cứu mình ...

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.

Cũng có thể ...

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

hoặc là...

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

hoặc là...

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

hoặc là...

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

15
Lưu ý về tính đầy đủ: phương pháp thứ 2 chỉ khả dụng trong C # 3.0+.
Jon Seigel

21
Vì mảng int đã thực hiện IEnumerable<int>, nên OfType<int>()không bắt buộc. ints.ToList();đủ.
Heinzi

16
Đối với OfType, bạn cần System.Linq
JasonPlutext

10
Không có ví dụ nào thực sự trả lời câu hỏi thực tế. Nhưng tôi đoán anh ấy đã chấp nhận câu trả lời để anh ấy hạnh phúc. Tuy nhiên, không một trong số này thực sự chuyển đổi một mảng thành một danh sách. "Chuyển đổi System.Array thành danh sách". Nên thêm ví dụ đó cho IMO đầy đủ. (Là câu trả lời hàng đầu và tất cả)
Søren Ullidtz

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

84

Ngoài ra còn có một quá trình xây dựng cho Danh sách sẽ hoạt động ... Nhưng tôi đoán điều này sẽ đòi hỏi một mảng được gõ mạnh.

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

... cho lớp 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);

Giữa cách tiếp cận này và cách sử dụng ToList(), cách nào hiệu quả hơn? Hay là có một sự khác biệt?
Ben Sutton

1
Khó có thể nói mà không biết kích thước tập dữ liệu thực (Danh sách sử dụng nội bộ mảng phải có khả năng mở rộng. Mảng là bất biến.) Nếu bạn biết kích thước Danh sách trả trước theo cách này có thể cải thiện hiệu suất một chút nhưng mức tăng sẽ rất nhỏ bạn cũng có thể sử dụng phiên bản bạn muốn duy trì.
Matthew Whited

3
Bạn có nhận thấy chủ đề này là 6 tuổi? (Và câu trả lời thứ hai của tôi trực tiếp xử lý ví dụ của anh ấy về việc sử dụng Arraythay vì int[].)
Matthew Whited

66

Điều thú vị là không ai trả lời câu hỏi, OP không sử dụng kiểu gõ mạnh int[]mà là Array.

Bạn phải sử dụng Arraycái mà nó thực sự là, một int[], sau đó bạn có thể sử dụng ToList:

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

Lưu ý rằng Enumerable.ToListgọi hàm tạo danh sách để kiểm tra trước nếu đối số có thể được truyền tới ICollection<T>(mà một mảng thực hiện), thì nó sẽ sử dụng ICollection<T>.CopyTophương thức hiệu quả hơn thay vì liệt kê chuỗi.


11
Cảm ơn bạn, Enum.GetValuestrả về một Mảng và điều này đã giúp tôi đưa ra một danh sách từ đó.
Martin Braun

3
Tôi biết điều này là cũ nhưng bạn đã đúng, câu hỏi là câu trả lời bởi điều này. Trong tình huống của tôi, trình giải mã động trả về một mảng hệ thống vì nó phải được chuẩn bị để chấp nhận bất kỳ loại dữ liệu nào để bạn không thể tải trước danh sách cho đến khi chạy. Cảm ơn bạn
Frank Cedeno

27

Phương pháp đơn giản nhất là:

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

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

hoặc là

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

7
Một nhu cầu using System.Linq;cho ToList()công việc.
Jarekczek

10

Trong trường hợp bạn muốn trả về một mảng enum như một danh sách, bạn có thể làm như sau.

using System.Linq;

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

5

Bạn có thể làm như thế này về cơ bản:

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

đây là mảng của bạn và hơn bạn có thể gọi danh sách mới của mình như thế này:

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

Bạn có thể làm điều này cho các đối tượng phức tạp quá.


4

trong vb.net chỉ cần làm điều này

mylist.addrange(intsArray)

hoặc là

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

2
tốt hơn nhiều so với việc sử dụng OfType <> (VS2010 của tôi sẽ không chấp nhận bất cứ điều gì OfType ...)
woohoo

3

Bạn chỉ có thể thử nó với mã của bạn:

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;

Sau đó, bạn chỉ có thể sử dụng anyVariable làm mã của mình.


2

Chỉ cần sử dụng phương thức hiện có .. .ToList ();

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

KISS (GIỮ IT SIMPLE SIR)


0

Tôi hy vọng điều này là hữu ích.

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

lấy giá trị chuỗi

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

lấy giá trị nguyên

        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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.