Есть ли в любом случае отформатировать набор элементов, когда формат также может измениться - PullRequest
0 голосов
/ 27 января 2011

Моя проблема действительно более сложная, но я упростил ее, чтобы было легче ее объяснить.

Предположим, вам нужно написать строку на разных языках, но вам нужно показать коллекцию предметов и возможное количество этих предметов, но вы не знаете точное их количество.

Давайте возьмем имена пользователей, [user1, user2, user3, user4]

Я хочу создать это ... "Привет, user1, user2, user3 и user4, нашим новым 4 пользователям за последний час"

Я хочу определить что-то вроде этого ... Привет {item (1)} {, item (2..n-1)} и {item (n)} нашим новым {count} пользователям в последний час.

Идея состоит в том, чтобы повторить элементы от 2 до n-1, чтобы получить значения, разделенные запятыми, а затем добавить фиксированные значения. {count} - это предопределенная переменная, это могут быть и другие (до сих пор думающие, что должны быть фиксированные имена).

Идея состоит в том, чтобы разрешить легкое изменение форматов для последующей интернационализации или других вещей.

Если вы не могли ничего понять, пожалуйста, спросите ...

Каков наилучший подход для решения этой проблемы в .Net?

спасибо.

Обновление

Основная идея состоит в том, чтобы разрешить изменение способа отображения данных, предположим, что я хочу теперь показать пользователя в разных строках (я могу изменить формат в базе данных для этого сообщения)

Здравствуйте, наши новые {count} пользователи за последний час {item (1.n-1) / br} {item (n)}.

Возможно, форматирование плохое, я просто пытаюсь получить идеи.

Обновление

Хорошо, давайте приведем еще один пример, чтобы показать, что я ищу, есть коллекция пользователей, но на самом деле я не знаю, как они должны выглядеть, формат шоу должен быть внутри этих тегов {} или что-то еще, что мы можем представить , Еще один более сложный пример.

Привет нашим новым пользователям.

{<div class="some class">item(2..n)</div>}

Ответы [ 3 ]

2 голосов
/ 27 января 2011
string template = "Hello to {NEWUSERS}, our new {COUNT} user(s) in last hour.";
string separator = ",";
//the two strings can be loaded from a config file

var userNames = new[] { "user1", "user2", "user3", "user4" };

int count = userNames.Length;
if (count == 0) { /* No new users */ }
string newUsers = count == 1 ? userNames[0]
                     : string.Join(separator, userNames.Take(count - 1)) 
                                 + " and " + userNames.Last();
string greeting = template.Replace("{NEWUSERS}", newUsers)
                          .Replace("{COUNT}", count);

Работает нормально, если изменить

string template = "Hello to our new {COUNT} user(s) in last hour: {NEWUSERS}";
2 голосов
/ 27 января 2011

Как насчет этого:

var usernames = new [] { "apple", "banana", "cherry",  };

var count = usernames.Count();

var users = count <= 1
    ? usernames.FirstOrDefault()
    : String.Join(" and ", String.Join(", ", usernames.SkipLast(1)), usernames.LastOrDefault());

var prefix = count == 0 ? "No" : String.Format("Hello to {0} our {1}", users, count);
var suffix = String.Format("new user{0} in the last half-hour.", count == 1 ? "" : "s");

var result = String.Format("{0} {1}", prefix, suffix);
0 голосов
/ 27 января 2011

Как это?

List<string> UserNames;
string commaDelimited = "Hello to " + UserNames.Aggregate((s1, s2) => s1 + ", " + s2) + String.Format(" our {0} new users in the last half-hour", UserNames.Count);
...