Это не вопрос производительности, так как оба имеют совершенно разную семантику.
Первый дает вам возможность использовать один объект для поиска другого объекта.
Второй дает вам возможность использовать один объект для поиска другого объекта, в котором вы можете использовать еще один объект для поиска третьего объекта.
Существует несколько иная функциональность с точки зрения того, как они могут быть впоследствии расширены.
В общем, я бы использовал Dictionary<Tuple<string, string>, string>
. Это даст мне составной ключ, который явно является составным ключом.
На самом деле, это не так, я бы создал новый класс. Как это не вариант? Тем не менее, если бы это было домашнее задание и «не создавайте новый класс» было частью вопроса, я бы использовал Dictionary<Tuple<string, string>, string>
.
Edit:
class DialectQuery : IEquatable<DialectQuery>
{
public Dialect{get;private set}
public Name{get;private set;}
public DialectQuery(string dialect, string name)
{
Dialect = dialect;
Name = name;
}
public bool Equals(DialectQuery other)
{
return other != null && Name == other.Name && Dialect == other.Dialect;
}
public override bool Equals(object other)
{
return Equals((object)other);
}
public override int GetHashCode()
{
int dHash = Dialect.GetHashCode();
return (dHash << 16 | dHash >> 16) ^ Name.GetHashCode();
}
}
Пока он ведет себя точно так же, как и Tuple. Хотя теперь, если я получаю запрос на изменение, диалекты должны быть нечувствительными к регистру, но имена запросов чувствительны к регистру, или что диалекты являются кодами и, следовательно, требуют инвариантного сравнения, но имена вводятся человеком и, следовательно, требуют сравнения с учетом культуры или чего-либо еще, Мне нужно сделать два простых изменения.
YAGNI не применяется, это не кодирование массивного объекта «на тот случай, если вам это нужно», это определение хорошего «хорошо, я, вероятно, не нуждаюсь в этом, но если я это сделаю, я пойду сюда».