2009-09-15 32 views
6

nó thực sự gây phiền nhiễu như thế nào C# dường như buộc bạn đặt tên rõ ràng chỉ mục của mỗi tham số trong String.Format, nếu bạn muốn thêm một tham số khác ở đâu đó, bạn phải tái lập chỉ mục chuỗi hoặc đặt thông số mới của bạn ở cuối.String.Format thứ tự tham số phiền toái

Có cách nào để C# tự động thực hiện việc này không?

ví dụ: (Tôi biết đây là pedants vô nghĩa, nó chỉ là một ví dụ :)

Tôi bắt đầu với:

String.Format("{0} {1} {1} {2} {3}", a, b, c, d) 

nếu tôi muốn thêm một tham số lúc đầu tôi có thể làm một trong các cách sau:

String.Format("{4} {0} {1} {1} {2} {3}", a, b, c, d, e) 
String.Format("{0} {1} {2} {2} {3} {4}", e, a, b, c, d) 

trong Delphi ví dụ tôi có thể làm tương đương với điều này:

String.Format("{} {} {} {2} {} {}", e, a, b, c, d) 
+0

Làm cả hai dòng trong C# và delphi trả lại cùng một điều? – Beatles1692

Trả lời

23

Vâng, không có gì trong C# để làm thứ là tự động cho bạn. Bạn luôn có thể viết phương pháp của riêng bạn để làm điều đó, nhưng thẳng thắn tôi thấy nó ít dễ đọc hơn. Có rất nhiều suy nghĩ để làm (IMO) để hiểu những gì dòng cuối cùng của bạn không hơn trước đó. Khi bạn nhấn {2} bạn đã có để tinh thần quay lại và thay thế các mục trước với {3} bỏ qua {2}, vv

Cá nhân tôi thích mã mà mất một chút thời gian để gõ, nhưng rõ ràng là để đọc.

+7

+1: Khả năng duy trì luôn giành được một khoản tiết kiệm khi viết ban đầu. – Richard

+5

+1 "Các chương trình máy tính phải được thiết kế để con người đọc và được chạy bằng máy tính" –

+0

Làm thế nào về String.Format ("{a} {b} {b} {c} {d}", a, b, c , d)? Điều này có thể được thêm vào trong .NET 4.0? Có lẽ trình biên dịch có thể giúp. Hoặc DLR mới? Tôi có thể thiếu một cái gì đó ở đây nhưng nó sẽ được tốt đẹp ... –

2

Hàm bạn yêu cầu không phải là một phần của khuôn khổ. Dưới đây là một phương pháp mở rộng tốt đẹp tôi đã tìm thấy cung cấp các thông số được đặt tên C#. Tôi nghĩ Marc Gravell đã đăng nó hoặc một trong những người khổng lồ SO khác.

 static readonly Regex rePattern = new Regex(@"\{([^\}]+)\}", RegexOptions.Compiled); 


    /// <summary> 
    /// Shortcut for string.Format. Format string uses named parameters like {name}. 
    /// 
    /// Example: 
    /// string s = Format("{age} years old, last name is {name} ", new {age = 18, name = "Foo"}); 
    /// 
    /// </summary> 
    /// <param name="format"></param> 
    /// <param name="values"></param> 
    /// <returns></returns> 
    public static string FN<T>(this string pattern, T template) 
    { 
     Dictionary<string, string> cache = new Dictionary<string, string>(); 
     return rePattern.Replace(pattern, match => 
     { 
      string key = match.Groups[1].Value; 
      string value; 

      if (!cache.TryGetValue(key, out value)) 
      { 
       var prop = typeof(T).GetProperty(key); 
       if (prop == null) 
       { 
        throw new ArgumentException("Not found: " + key, "pattern"); 
       } 
       value = Convert.ToString(prop.GetValue(template, null)); 
       cache.Add(key, value); 
      } 
      return value; 
     }); 
    } 
+0

Đẹp, nhưng có tác động hiệu suất lớn !! – ShloEmi

1

Mặc dù C# không thể thực hiện việc này cho bạn, công cụ có thể trợ giúp tại đây.

Tính năng chia sẻ lại ví dụ cảnh báo bạn nếu bạn có nhiều tham số hơn trong chuỗi sau chuỗi. Tôi nhìn nếu tham số sắp xếp lại trong Resharper được hỗ trợ nhưng trong trường hợp này nó không phải là (R # hỗ trợ thay đổi chữ ký phương pháp nhưng điều đó không giúp đỡ ở đây).

Xem mã Rush từ DevEx. Công cụ đó rất có thể có những gì bạn cần.

1

Tôi biết điều này là cũ, tôi đồng ý với Jon. Ngay cả với chuỗi định dạng lớn (xem ví dụ mã bên dưới), nó vẫn chỉ mất ít hơn 1 phút để làm lại các vị trí chỉ mục của các mục nếu tôi phải thêm thứ gì đó và tôi thấy nó dễ bảo trì hơn và dễ đọc hơn. để tự động hóa quy trình. Vấn đề với tự động hóa cho điều này là khi tôi cố gắng nhìn vào mã một vài tuần sau .. bạn không thể chỉ tìm ra nó ngay từ cái nhìn đầu tiên. Ngoài ra, một khi bạn học Visual Studio tốt và học cách sử dụng những thứ như chế độ chỉnh sửa khối, và một số tính năng nâng cao khác, bạn có thể khá hiệu quả.

//----------------------------------------------------------------------------- 
// <copyright file="ShellForm.cs" company="DCOM Productions"> 
//  Copyright (c) DCOM Productions. All rights reserved. 
// </copyright> 
//----------------------------------------------------------------------------- 

string updateCommandText = string.Format("UPDATE `moh`.`moh` SET ageact = '{0}', branch = '{1}', cemetary = '{2}', citation = '{3}', citycement = '{4}', cdateact = '{5}', cdateaward = '{6}', cdatebirth = '{7}', cdatedeath = '{8}', namefirst = '{9}', namelast = '{10}', placeact = '{11}', placeenter = '{12}', presat = '{13}', presby = '{14}', rankact = '{15}', rankawd = '{16}', rankhigh = '{17}', synopsis = '{18}', unit = '{19}', war = '{20}', imgfile = '{21}' WHERE ID = '{22}'", 
    /* {0} */ uxAgeAct.Text.Replace("'", "''"), 
    /* {1} */ uxBranch.Text.Replace("'", "''"), 
    /* {2} */ uxCemetary.Text.Replace("'", "''"), 
    /* {3} */ uxCitation.Text.Replace("'", "''"), 
    /* {4} */ uxCityCemetary.Text.Replace("'", "''"), 
    /* {5} */ uxDateAct.Text.Replace("'", "''"), 
    /* {6} */ uxDateAward.Text.Replace("'", "''"), 
    /* {7} */ uxDateBirth.Text.Replace("'", "''"), 
    /* {8} */ uxDateDiceased.Text.Replace("'", "''"), 
    /* {9} */ uxNameFirst.Text.Replace("'", "''"), 
    /* {10} */ uxNameLast.Text.Replace("'", "''"), 
    /* {11} */ uxPlaceAct.Text.Replace("'", "''"), 
    /* {12} */ uxPlaceEnter.Text.Replace("'", "''"), 
    /* {13} */ uxPresentedAt.Text.Replace("'", "''"), 
    /* {14} */ uxPresentedBy.Text.Replace("'", "''"), 
    /* {15} */ uxRankAct.Text.Replace("'", "''"), 
    /* {16} */ uxRankAwarded.Text.Replace("'", "''"), 
    /* {17} */ uxRankHigh.Text.Replace("'", "''"), 
    /* {18} */ uxSynopsis.Text.Replace("'", "''"), 
    /* {19} */ uxUnit.Text.Replace("'", "''"), 
    /* {20} */ uxWar.Text.Replace("'", "''"), 
    /* {21} */ uxImgFile.Text.Replace("'", "''"), 
    /* {22} */ dataRow["ID"].ToString()); 
3

Tính đến Visual Studio 2015, bạn có thể đứng về phía bước vấn đề này bằng Interpolated Strings (nó một thủ thuật trình biên dịch, vì vậy nó không quan trọng mà phiên bản của .NET Framework bạn nhắm mục tiêu).

Mã này sau đó trông giống như sau

string txt = $"{person.ForeName} is not at home {person.Something}"; 

Tôi nghĩ rằng nó làm cho mã dễ đọc hơn và ít bị lỗi.

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