2010-02-05 44 views
50

Tôi muốn để lặp qua bảng chữ cái như vậy:cách nhanh nhất để liệt kê các bảng chữ cái

foreach(char c in alphabet) 
{ 
//do something with letter 
} 

là một mảng của chars cách tốt nhất để làm điều này? (Feels hacky)

Edit: Các số liệu là "tối thiểu gõ để thực hiện trong khi vẫn là có thể đọc được và mạnh mẽ"

+0

Bất cứ lúc nào bạn đặt một câu hỏi "tốt nhất", bạn cần phải cung cấp số liệu để đánh giá chống lại hoặc nếu không mọi người sẽ ném câu trả lời cụ thể ra mà khả năng không áp dụng cho trường hợp duy nhất của bạn. –

+0

Điều duy nhất có thể là hacky khi bạn đặt nó là bạn đang sử dụng một vòng lặp foreach thay vì một tiêu chuẩn cho vòng lặp, nhưng thậm chí sau đó nó không thực sự hacky. – Woot4Moo

+0

Tôi đang tìm kiếm một cách "neater" hơn là liệt kê trên một loạt các ký tự. Số liệu là "ít nhất là gõ để thực hiện trong khi vẫn có thể đọc được và mạnh mẽ" - câu trả lời của Richard gần nhất với suy nghĩ ban đầu của tôi (mà tôi không thể nói rõ tại thời điểm đặt câu hỏi) – Ben

Trả lời

120

(Giả ASCII, vv)

for (char c = 'A'; c <= 'Z'; c++) 
{ 
    //do something with letter 
} 

Ngoài ra, bạn có thể chia nó ra để một nhà cung cấp và sử dụng một iterator (nếu bạn đang có kế hoạch hỗ trợ quốc tế):

public class EnglishAlphabetProvider : IAlphabetProvider 
{ 
    public IEnumerable<char> GetAlphabet() 
    { 
     for (char c = 'A'; c <= 'Z'; c++) 
     { 
      yield return c; 
     } 
    } 
} 

IAlphabetProvider provider = new EnglishAlphabetProvider(); 

foreach (char c in provider.GetAlphabet()) 
{ 
    //do something with letter 
} 
+3

Woah ... không bao giờ nghĩ về điều đó. Rực rỡ! – Bobby

+12

Nếu bạn neeeeed foreach: 'Enumerable.Range ('a', 'z' - 'a' + 1) .Chọn (x => (char) x)' –

+0

@Richard: Bạn chỉ cần cung cấp một nửa dung dịch. Tôi thích phương pháp IAlphabetProvider chung của bạn, nhưng bạn cần một nhà máy để có được nhà cung cấp chính xác. Một cái gì đó như: var provider = AlphabetProvider.GetProvider (CultureInfo.CurrentCulture); – Steven

1

bạn có thể làm điều này:

for(int i = 65; i <= 95; i++) 
{ 
    //use System.Convert.ToChar() f.e. here 
    doSomethingWithTheChar(Convert.ToChar(i)); 
} 

Mặc dù, không phải là cách tốt nhất. Có lẽ chúng ta có thể giúp đỡ tốt hơn nếu chúng ta biết lý do cho việc này.

+1

Đồng ý, cần lý do. –

+6

Cần thêm 'char'! – meagar

2

Tốt để sử dụng vòng lặp foreach trong C#, bảng chữ cái có thể là bất kỳ IEnumerable<char> nào. Những gì cảm thấy "hacky" về nó?

31

Hoặc bạn có thể làm,

string alphabet = "abcdefghijklmnopqrstuvwxyz"; 

foreach(char c in alphabet) 
{ 
//do something with letter 
} 
+2

Với giải pháp này, quốc tế hóa là dễ dàng: sử dụng các chữ cái khác nhau :) (giả sử C# foreach char đi qua thư chứ không phải là chuỗi 8-bit). Nếu không, tôi không biết cách tiếp cận tốt nhất cho các ký tự nhiều byte trong C#. –

+0

@JoeyAdams Đối với quốc tế hóa, bạn sẽ lấy chữ được viết mã cứng ra khỏi mã và lấy nó qua ResourceManager hay cái gì đó? –

+1

@JoeyAdams ['String.GetEnumerator()'] (https://msdn.microsoft.com/en-us/library/system.string.getenumerator%28v=vs.110%29.aspx) đi 'char' bởi char, vì vậy bạn chỉ có một điểm mã Unicode/cặp thay thế một phần nếu chuỗi của bạn chứa các ký tự đó. Vì vậy, bạn có thể muốn bình thường hóa cả bảng chữ cái và dữ liệu bạn so sánh với bảng chữ cái và đảm bảo bạn nghĩ về các điểm số dạng số thay vì 'char': https://stackoverflow.com/a/28155130/429091 – binki

0

Tôi thấy điều này:

foreach(char letter in Enumerable.Range(65, 26).ToList().ConvertAll(delegate(int value) { return (char)value; })) 
{ 
//breakpoint here to confirm 
} 

khi đọc ngẫu nhiên blog này, và nghĩ rằng nó là một cách thú vị để hoàn thành nhiệm vụ.

+4

Tôi hy vọng điều này là một trò đùa. Thực sự :) –

3
Enumerable.Range(65, 26).Select(a => new { A = (char)(a) }).ToList().ForEach(c => Console.WriteLine(c.A)); 
+2

Không có nhiều điểm mới tạo một đối tượng ẩn danh để lưu trữ một thuộc tính duy nhất. Và câu lệnh 'foreach' được xây dựng sẵn thường rõ ràng hơn để thực hiện một hành động trên mỗi mục của một chuỗi - đó là những gì nó làm. –

+0

Để đơn giản hóa: Enumerable.Range (65, 26) .ToList(). ForEach (c => Console.WriteLine ((char) c)); – Eraph

5
var alphabet = Enumerable.Range(0, 26).Select(i => Convert.ToChar('A' + i)); 
Các vấn đề liên quan