2009-06-21 40 views
9

Tôi muốn tạo ra một mảng đối tượng trong C# có độ dài không xác định và sau đó cư mảng trong một vòng lặp như vậy ...Tạo mảng C# đối tượng có chiều dài không xác định?

string[] splitWords = message.Split(new Char[] { ' ' }); 

    Word[] words = new Word[]; 
    int wordcount = 0; 
    foreach (string word in splitWords) 
    { 
     if (word == "") continue; 
     words[wordcount] = new Word(word); 
     wordcount++; 
    } 

Tuy nhiên, tôi nhận được lỗi ... "tạo mảng phải có kích thước mảng hoặc bộ khởi tạo mảng "

Tôi đang thực hiện nhiều logic hơn trong vòng lặp foreach mà tôi đã bỏ qua ngắn gọn.

+1

Bạn có cần sử dụng mảng không? Làm việc này với Danh sách thường dễ dàng hơn rất nhiều - và có thể thực hiện nhiều hơn (theo kinh nghiệm của tôi). – Bevan

Trả lời

40

Những gì bạn muốn làm là tạo ra:

List<Word> words = new List<Word>(); 

và sau đó:

words.Add(new Word(word)); 

Và cuối cùng khi vòng lặp được thực hiện nếu bạn cần một mảng:

words.ToArray(); 
6

Bạn không thể tạo một mảng có độ dài không xác định. Đây là nơi bạn sẽ sử dụng Danh sách chung.

List<Word> words = new List<Word>(); 
9

Nếu bạn đang sử dụng C# 3.5, bạn chỉ có thể thực hiện như sau.

var words = message 
    .Split(new char[]{' '}) 
    .Where(x => x != "") 
    .Select(x => new Word(x)) 
    .ToArray(); 
+1

Nếu không có giải pháp LINQ cho vấn đề của bạn, bạn không cố gắng hết sức :) Tốt nhất. –

+4

Nội dung hay. Một lưu ý, sử dụng StringSplitOptions.RemoveEmptyEntries làm tham số Split() thứ hai của bạn sẽ loại bỏ cuộc gọi Where(). Mặc dù nó dài hơn, nó sẽ lưu một vòng lặp khác thông qua mảng chuỗi. – statenjason

-2

Tôi giải quyết nó bằng cách sử dụng một ArrayList và sau đó đúc nó vào mảng đối tượng sau khi lặp lại ...

string[] splitWords = message.Split(new Char[] {' '}); 
    ArrayList wordList = new ArrayList(); 
    int wordcount = 0; 
    foreach (string word in splitWords) 
{ 
     if (word == "") continue; 
     Word newWord = new Word(word); 
     wordList.Add(newWord); 
     wordcount++; 
} 
    Word[] words = (Word[])wordList.ToArray(typeof(Word)); 

Tôi đã nghe toàn bộ "tạo câu hỏi/trả lời chỉ để ghi lại nó cho những người khác "là chấp nhận được. Plus Tôi muốn nghe nếu có đề xuất tốt hơn. Cảm ơn.

+3

Các câu trả lời khác (ví dụ: Danh sách ) được coi là tốt hơn, vì ToArray() ít mã hơn và an toàn hơn (bạn không thể vô tình đặt các từ không trong đó. –

+0

Câu trả lời hay về việc sử dụng Danh sách chung ... không chắc tại sao tôi không nghĩ về điều đó trước tiên. Cảm ơn! Ngoài ra, tôi đoán đưa dự đoán đầu tiên của tôi như là một "câu trả lời" không phải là một ý tưởng hay khi xem xét các phiếu bầu và ding cho đại diện của tôi! ha – Lyndal

0

Trên thực tế bạn có thể sử dụng danh sách để cư từ của bạn đầu tiên và sau đó chuyển đổi nó một cách dễ dàng để mảng như thế này:

string[] splitWords = message.Split(new Char[] { ' ' }); 

List<Word> words = new List<Word>(); 
int wordcount = 0; 
foreach (string word in splitWords) 
{ 
    if (word == "") continue; 
    words.add(new Word(word)); 
    //wordcount++; 
} 

wordcount = words.count; 
return words.ToArray(); 
1

Một lưu ý thân thiện, bạn có thể vượt qua tùy chọn để chia bỏ qua mục rỗng. Giả sử không có logic khác để prune ra mục bạn có thể preinitialize mảng của bạn như vậy:

string[] splitWords = message.Split(new Char[] {' '}, 
    StringSplitOptions.RemoveEmptyEntries); 
Word[] words = new Word[splitWords.Length]; 
+0

Cảm ơn, tôi đã làm điều này dựa trên một bình luận khác để trả lời. Cảm ơn, tôi chưa phát hiện ra tùy chọn này. – Lyndal

0

Tôi đang tự hỏi tại sao chúng ta không thể chỉ cần sử dụng một biến chuỗi (nói x), khởi tạo nó và lấy dấu phẩy tách dữ liệu trong nó và sau đó sử dụng string[] biến (nói y[]) và khởi tạo nó bằng x.Split(',') mà không cần phải khởi tạo một mảng trống như sau:

string x = string.Empty; 
string msg = "hi,how,r,u,xyz"; 

void Page_Load(object sender, EventArgs e) 
    x = msg; 
    string[] y = msg.Split(','); 

tôi nghĩ rằng điều này sẽ làm việc khi cần thiết nhưng tôi đã không cố gắng chạy này vì vậy tôi không chắc chắn. Nếu ai đó nghĩ rằng giải pháp của tôi là sai, hãy sửa tôi.

Các vấn đề liên quan