Как может Соединить каналом. Объединение использоваться больше чем с двумя аргументами?

Если роль только , которая отличает этих людей, это роль, но все детали одинаковы, то я бы определенно выбрал одну таблицу.

Вопрос, однако, может ли один человек иметь более чем одну роль? Если это не так, добавьте столбец role_type в таблицу person. В зависимости от того, насколько фиксированы эти роли, возможно, используйте справочную таблицу и внешний ключ, например:

create table role_type
(
   id integer primary key,
   name varchar(20) not null unique
);

create table person
(
  id integer primary key, 
  .... other attributes ..., 
  role_id integer not null references role_type
);

Однако, по моему опыту, ограничение ровно одной роли на человека обычно не выполняется, так что вы бы нужен корабль связи «многие ко многим»

create table role_type
(
   id integer primary key,
   name varchar(20) not null unique
);

create table person
(
  id integer primary key, 
  .... other attributes ..., 
);

create table person_role
(
  person_id integer not null references person, 
  role_id integer not null references role_type, 
  primary key (person_id, role_id)
);
22
задан Peter Mortensen 15 October 2018 в 17:18
поделиться

3 ответа

С точки зрения эффективности дело не в ИМО, а в аспекте удобства использования. Лично я думаю, что должна быть перегрузка:

Combine(string first, string second, string third, params string[] others)

Вам нужно иметь как минимум три, чтобы предотвратить конфликт с существующей версией с двумя параметрами, если вы просто напишите Path.Combine ("foo", "bar ") но это, безусловно, поможет сделать код более понятным. Почему бы не открыть запрос функции в Connect ?

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

public static string CombinePaths(string first, params string[] others)
{
    // Put error checking in here :)
    string path = first;
    foreach (string section in others)
    {
        path = Path.Combine(path, section);
    }
    return path;
}
23
ответ дан 29 November 2019 в 04:12
поделиться

Если у вас уже есть массив или IEnumerable , то вы можете сделать это в одну строку ...

// I'm assuming that you've got an array or IEnumerable<T> from somewhere
var paths = new string[] { path1, path2, path3, path4, path5, path6 };

string result = paths.Aggregate(Path.Combine);

Если нет, то напишите свой собственный метод расширения в строку ...

public static class PathExtension
{
    public static string CombinePathWith(this string path1, string path2)
    {
        return Path.Combine(path1, path2);
    }
}

... который позволил бы вам связать их вот так ...

string result = path1.CombinePathWith(path2)
                     .CombinePathWith(path3)
                     .CombinePathWith(path4)
                     .CombinePathWith(path5)
                     .CombinePathWith(path6);
27
ответ дан 29 November 2019 в 04:12
поделиться

Довольно просто реализовать это самостоятельно:

public string Combine(params string[] paths)
{
    char[] pathSeparators = new char[] 
        { Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar, Path.VolumeSeparatorChar };

    if(paths == null) throw new ArgumentNullException("paths");
    if(paths.Length == 1) return paths[0];

    StringBuilder pathBuilder = new StringBuilder();

    foreach(string path in paths)
    {
        if(Path.IsPathRooted(path))
            pathBuilder = new StringBuilder(path);
        else
        {
            char last = pathBuilder.Length > 0 ?
                pathBuilder[pathBuilder.Length - 1] :
                path[path.Length - 1];

            if(Array.IndexOf(pathSeparators, last) == -1)
                pathBuilder.Append(Path.DirectorySeparatorChar);

            pathBuilder.Append(path);
        } // else
    } // foreach

    return pathBuilder.ToString();
}

[Test()]
public void CombinePaths()
{
    string result = Combine(@"C:\Program Files\", @"Microsoft.NET", @"ADOMD.NET\", "90", "msadomdx.dll");
    Assert.AreEqual(@"C:\Program Files\Microsoft.NET\ADOMD.NET\90\msadomdx.dll", result);
}
1
ответ дан 29 November 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: