В C # лучший способ проверить, содержит ли stringbuilder подстроку - PullRequest
10 голосов
/ 25 февраля 2011

У меня есть существующий объект StringBuilder, код добавляет некоторые значения и разделитель к нему. Теперь я хочу изменить код, добавив логику, что перед добавлением текста я хочу проверить, действительно ли он существует в переменной строителя строк или нет? Если нет, то только добавить, в противном случае игнорировать. Каков наилучший способ сделать это? Нужно ли менять объект на строковый тип? Нужен лучший подход, который бы не мешал работе.

public static string BuildUniqueIDList(context RequestContext)
{
    string rtnvalue = string.Empty;
    try
    {
        StringBuilder strUIDList = new StringBuilder(100);
        for (int iCntr = 0; iCntr < RequestContext.accounts.Length; iCntr++)
        {
            if (iCntr > 0)
            {
                strUIDList.Append(",");
            }
            //need to do somthing like strUIDList.Contains(RequestContext.accounts[iCntr].uniqueid) then continue other wise append
            strUIDList.Append(RequestContext.accounts[iCntr].uniqueid);
        }
        rtnvalue = strUIDList.ToString();
    }
    catch (Exception e)
    {
        throw;
    }
    return rtnvalue;
}

Я не уверен, будет ли эффективно что-то подобное: if (! strUIDList.ToString (). Contains (RequestContext.accounts [iCntr] .uniqueid.ToString ()))

1 Ответ

7 голосов
/ 25 февраля 2011

Лично я бы использовал:

return string.Join(",", RequestContext.accounts
                                      .Select(x => x.uniqueid)
                                      .Distinct());

Нет необходимости явно зацикливаться, вручную использовать StringBuilder и т. Д. ... просто выразить все это декларативно:)

(Вы быв конце нужно вызвать ToArray(), если вы не используете .NET 4, что, очевидно, несколько снизит эффективность ... но я сомневаюсь, что это станет узким местом для вашего приложения.)

РЕДАКТИРОВАТЬЛадно, для решения без LINQ ... если размер разумно маленький, я бы просто для:

// First create a list of unique elements
List<string> ids = new List<string>();
foreach (var account in RequestContext.accounts)
{
    string id = account.uniqueid;
    if (ids.Contains(id))
    {
        ids.Add(id);
    }
}

// Then convert it into a string.
// You could use string.Join(",", ids.ToArray()) here instead.
StringBuilder builder = new StringBuilder();
foreach (string id in ids)
{
    builder.Append(id);
    builder.Append(",");
}
if (builder.Length > 0)
{
    builder.Length--; // Chop off the trailing comma
}
return builder.ToString();

Если бы вы могли иметь большой коллекция строк, вы можете использовать Dictionary<string, string> как своего рода подделку HashSet<string>.

...