2011-06-22 21 views
6

Tôi có một bộ sưu tập các tên đầu tiên mà tôi cần phải kết hợp thành một chuỗi được phân tách bằng dấu phẩy.Cách tạo Chuỗi từ Bộ sưu tập Tên

Chuỗi được tạo cần phải tuân thủ ngữ pháp phù hợp.

Nếu bộ sưu tập chứa một tên, sau đó sản lượng nên được chỉ tên:

John 

Nếu bộ sưu tập bao gồm hai tên, sau đó đầu ra nên được tách ra bằng từ "và":

John and Mary 

Nếu bộ sưu tập bao gồm ba hoặc nhiều tên, sau đó đầu ra nên được dấu phẩy phân cách, và tên cuối cùng nên có từ "và" trước khi nó:

John, Mary, and Jane 

Đây là mã tôi đã đưa ra. Nó không phải là rất thanh lịch và tôi muốn biết nếu có một cách tốt hơn để thực hiện điều này trong C# (4.0 là OK).

List<string> firstNames = new List<string>(); 
firstNames.Add("John"); 
firstNames.Add("Mary"); 
firstNames.Add("Jane"); 

string names = string.Empty; 
for (int i = 0; i < firstNames.Count; i++) 
{ 
    if (i == 1 && firstNames.Count == 2) 
    { 
     names += " and "; 
    } 
    else if (firstNames.Count > 2 && i > 0 && i != firstNames.Count - 1) 
    { 
     names += ", "; 
    } 
    else if (i != 0 && i == firstNames.Count - 1) 
    { 
     names += ", and "; 
    } 

    names += firstNames[i]; 
} 
+0

Bạn có chắc chắn bạn muốn ', and' giữa hai cuối cùng? –

+0

@ Henk, Đó là vấn đề ưu tiên. Cả hai (có và không có dấu phẩy) đều đúng. – Nate

+0

Hướng dẫn kiểu thường thêm dấu phẩy, nhưng chúng cũng (đôi khi) cho biết bạn có thể phân chia bằng dấu phẩy. I E. cả hai "A, B và C" và "A, B, và C" đều được coi là chính xác, nhưng sau này là cái được gợi ý nhiều nhất. Xem http://www.wikihow.com/Use-English-Punctuation-Chính xác cho một ví dụ như vậy, phần 5, dấu đầu dòng thứ hai. –

Trả lời

6

Tôi không nghĩ rằng nó sẽ nhận được tao nhã hơn:

if (names.Count == 0) 
    return ""; 

if (names.Count == 1) 
    return names[0]; 

if (names.Count == 2) 
    return names[0] + " and " + names[1]; 

return String.Join(", ", names.Take(names.Count - 1)) + 
    ", and " + names[names.Count - 1]; 

Tôi đã không được biên dịch này, nhưng tôi nghĩ rằng bạn sẽ có được ý tưởng.

EDIT: ngắn hơn, nhưng ít có thể đọc:

if (names.Count <= 2) 
    return String.Join(" and ", names); 

return String.Join(", ", names.Take(names.Count - 1)) + 
    ", and " + names[names.Count - 1]; 
+0

+1 Tôi thường ngạc nhiên về việc có bao nhiêu lập trình viên biết về 'Tham gia()' –

+0

Tôi không biết. Mặc dù đây là một vấn đề tầm thường, tôi đã học được điều gì đó sẽ hữu ích cho các vấn đề trong tương lai! – Avalanchis

3

tôi sẽ làm một cái gì đó như thế này:

using System; 
using System.Collections.Generic; 

class Program { 

    static void Main(string[] args) { 
     List<string> firstNames = new List<string>(); 
     firstNames.Add("John"); 
     firstNames.Add("Mary"); 
     firstNames.Add("Jane"); 
     Console.WriteLine(NamesString(firstNames)); 
    } 

    static string NamesString(List<string> firstNames) { 
     switch (firstNames.Count) { 
     case 0: 
      return string.Empty; 
     case 1: 
      return firstNames[0]; 
     case 2: 
      return string.Join(" and ", firstNames.ToArray()); 
     default: 
      return string.Format("{0} and {1}", 
       string.Join(", ", firstNames.ToArray(), 0, firstNames.Count - 1), 
       firstNames[firstNames.Count - 1]); 
     } 
    } 
} 

EDIT: thực sự cần được

 default: 
      return string.Format("{0}, and {1}", 

nếu bạn muốn có một dấu phẩy trước khi người cuối cùng "và".

0
List<string> firstNames = new List<string>(); 
firstNames.Add("John"); 
firstNames.Add("Mary"); 
firstNames.Add("Jane"); 

StringBuilder names = new StringBuilder(); 
for (int i = 0; i < firstNames.Count; i++) 
{ 
    if((i-1) == firstNames.Count && names.length > 0) 
     names.AppendFormat(" and {0}", names[i]); 
    else if(names.length > 0) 
     names.AppendFormat(", {0}", names[i]);  
} 
return names.ToString(); 

Tôi nghĩ đây là cách tốt nhất.

+0

bạn sẽ không bị thêm dấu phẩy nếu danh sách chỉ chứa một tên? bạn cũng nhầm lẫn việc sử dụng tên và firstNames? –

+0

Giải pháp này không hiệu quả đối với tôi. – Avalanchis

2
 string a=string.Join(",", FirstNames.ToArray()); 
     if (FirstNames.Count == 1) 
      a.Replace(",", ""); 
     else if (FirstNames.Count == 2) 
      a.Replace(",", " and "); 
     else 
     { 
      int i = a.LastIndexOf(","); 
      a = a.Substring(1, i) + a.Substring(i).Replace(",", " and "); 
     } 
+1

Giải pháp này không tính đến sự cần thiết phải có họ "và" được chèn trước đó. – Avalanchis

+0

Xin lỗi, tôi đã đọc sai. Tôi đã thêm hỗ trợ. – therealmitchconnors

1
static string JoinNames(List<string> firstNames) 
    { 
     int count = firstNames.Count; 
     if(count == 1) 
     { 
      return firstNames[0]; 
     } 

     if(count > 1) 
     { 
      return string.Join(", ", firstNames.Take(count - 1).ToArray()) + " and " + firstNames[count - 1]; 
     } 
     return string.Empty; 
    } 
0
List<string> firstNames = new List<string>(); 
firstNames.Add("John"); 
firstNames.Add("Mary"); 
firstNames.Add("Jane"); 
int cnt = 0; 
string names = string.Empty; 
while (cnt<=firstName.Count) 
{ 
    string separator = ""; 

    if (firstName.Count - cnt > 1) separator = ", "; 

    else if (firstName.Count - cnt = 1) separator = ", and "; 

    else separator = ""; 

    names += firstName[cnt] + separator; 

    cnt += 1; 


} 
+0

Tôi nhận được một ArgumentOutOfRangeException khi danh sách đầu vào chỉ chứa một tên. – Avalanchis

0

Dưới đây là một giải pháp thú vị:

 //code 
     List<string> firstNames = new List<string>(); 
     firstNames.Add("John"); 
     firstNames.Add("Mary"); 
     firstNames.Add("Jane"); 

     StringBuilder sb = new StringBuilder(); 
     firstNames.Take(firstNames.Count - 1).ToList().ForEach(fn => AddString(fn, sb)); 
     sb.Append(", and " + firstNames.Last()); 

    //Helper Function 
    public void AddString (string fn, StringBuilder sb) 
    { 
     if (sb.Length != 0) 
     { 
      sb.Append(", "); 
     } 
     sb.Append(fn); 
    } 
+0

Khi chỉ có một tên đầu vào, bản in này: 'và John' – Avalanchis

0

Hãy thử điều này trên cho kích thước:

  List<string> firstNames = new List<string>(); 
      firstNames.Add("John"); 
      firstNames.Add("Mary"); 
      firstNames.Add("Jane"); 

      // Only do this if there is more than one name 
      if (firstNames.Count > 1) 
      { 
       string separator = ", "; 

       // Join the names, using ", " as a separator 
       string names = String.Join(seperator, firstNames.ToArray()); 

       // Insert "and" before the last comma 
       names = names.Insert(names.LastIndexOf(separator), ", and "); 

       // Remove the last comma 
       names = names.Remove(names.LastIndexOf(separator), separator.Length); 
      } 
+0

Tác phẩm này hoạt động nhưng không bao gồm dấu phẩy Oxford. – Avalanchis

+0

Hiện tại! :) –

0
var a = String.Join(", ", firstNames.Skip(1).ToArray()) + (firstNames.Count < 2 ? "" : ", and ") + firstNames.Take(1).FirstOrDefault(); 
+0

Giải pháp này chèn dấu phẩy khi chỉ có hai tên trong bộ sưu tập. – Avalanchis

+0

ah ok. Thật là một thằng ngốc, cảm ơn vì đã chỉ ra điều đó. Đó là những gì sẽ xảy ra khi bạn bung dấu phẩy vào phút cuối. – Tom

0

Tôi thích mã dễ đọc nhất. Bạn có 4 trường hợp dấu câu để xem xét khi thêm tên vào danh sách, vì vậy chỉ cần đánh vần chúng.

static string Combine(List<string> names) 
{ 
    var sb = new StringBuilder(); 
    for (int i = 0; i < names.Count; i++) 
    { 
     if (i == 0) //at start of a list 
      {} 

     else if (i < names.Count - 1) //in middle of list 
      sb.Append(", "); 

     else if(names.Count == 2) //at end of a list with 2 elements 
      sb.Append(" and "); 

     else //at end of a list with 3 or more elements 
      sb.Append(", and "); 

     sb.Append(names[i]); 
    } 
    return sb.ToString(); 
} 
0
public string Combine(List<string> names) 
{ 
    if (names == null || names.Count == 0) 
    { 
     return string.Empty; 
    } 

    var sb = new StringBuilder(); 
    sb.Append(names[0]); 

    //Handle Special Case of 2 names 
    if (names.Count == 2) 
    { 
     sb.Append(" and " + names[1]) 
     return sb.ToString(); 
    } 

    for (int i = 1; i < names.Count; i++)   
    { 
     if (i == (names.Count -1)) 
     { 
      sb.Append(", and " + names[i]); 
     } 
     else 
     { 
      sb.Append(", " + names[i]); 
     } 
    } 

    return sb.ToString(); 
} 
Các vấn đề liên quan