Вопрос геймерам. Подбираете ли вы IRL монетки, валяющиеся под ногами?

Вопрос геймерам. Подбираете ли вы IRL монетки, валяющиеся под ногами?

четверг, 24 февраля 2011 г.

Программерское - 2

Помимо борьбы с ленью, в процессе написания программ, активно взаимодействующих с СУБД, часто возникает необходимость хранить SQL-запросы в более структурированном виде, нежели просто строка. А не парсить уже созданный запрос.

Под катом вариация на тему StringBuilder для интересующихся.



using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace CoolProject
{
// Дерево строк. Соединяется в одну строку методом ToString()
по аналогии со StringBuilder,
// только рекурсивно и с применением форматирования,
задаваемого свойством Format.
public class QueryBuilder : List<QueryBuilder>
{
// Полезное содержимое и формат вставки дочерних объектов
public string Format { get; set; }
// Разделитель
public string Separator { get; set; }

public QueryBuilder(string format)
{
    Format = format;
}

public QueryBuilder(string format, string separator,
    params string[] childs)
{
    Format = format;
    Separator = separator;
    foreach (var v in childs)
        if (v != null)
            Add(v);
}

public QueryBuilder(string format, string separator,
    params QueryBuilder[] childs)
{
    Format = format;
    Separator = separator;
    foreach (var v in childs)
        if (v != null)
            Add(v);
}

public override string ToString()
{
    if (Format.Contains("{0}"))
    {
        string s;
        var b = new StringBuilder();

        foreach (var qb in this)
            if ((s = qb.ToString()).Length > 0)
                b.Append(b.Length == 0 ? s : Separator + s);
        return b.Length == 0 ? string.Empty :
            string.Format(Format, b.ToString());
    }
    else
        return Format;
}

public virtual QueryBuilder Add(string format)
{
    if (string.IsNullOrEmpty(format))
        return null;

    var item = new QueryBuilder(format);
    Add(item);
    return item;
}

public void AddRange(string[] formats)
{
    foreach (string format in formats)
        Add(new QueryBuilder(format));
}

public void AddUnique(string format)
{
    if (!Contains(format))
        Add(new QueryBuilder(format));
}

public new QueryBuilder this[int index]
{ get { return base[index]; } }

public QueryBuilder this[string index]
{
    get { return Find(obj => obj.Format == index); }
}

public QueryBuilder this[params string[] indeces]
{
    get
    {
        var qb = this;

        foreach (string s in indeces)
            qb = qb[s];
        return qb;
    }
}

public bool Contains(string index)
{
    return this[index] != null;
}
}
}

Может, и велосипед изобрёл, х/з.

15 комментариев:

  1. ого, очень помогло по учебе! спасибо!

    ОтветитьУдалить
  2. Удивительно гармоничное смешение цифр, символов илатиницы!!

    ОтветитьУдалить
  3. хороший отрывок, обязательно может пригодиться!

    ОтветитьУдалить
  4. Завидую людям, которые могут это «прочитать».

    ОтветитьУдалить
  5. Комменты слегка вылезли. Может и полезно, но какбэ нет примеров использования. Для своей цели наверняка нужная весчь. В ado.net есть что-то наподобие query-билдера. Создаём параметры запроса, они сразу проверяются на sql-injection. Можно вообще заюзать entity framework.

    ОтветитьУдалить
  6. В закрома. А вы Си Шарп знаете, мне нужна помощь.

    ОтветитьУдалить
  7. UtroClickClick> забыл, что надо тестировать в разных браузерах. Пофиксил. Насчёт примеров согласен, выложу в понедельник что-нибудь.

    Alina> Говори, поможем.

    ОтветитьУдалить
  8. Помогите разобраться с компонентом WebBrowser.
    Нужно отключить загрузку картинок.

    ОтветитьУдалить
  9. Добавил в закладки, позже пригодится для одного проектика

    ОтветитьУдалить