Эта ситуация может быть намного сложнее, чем я хочу, но я все равно ее выдвигаю. Это для дизайна игрового типа.LINQ, Слияние списков с соответствующими «переопределениями»
Значения здесь жестко закодированы, но этого не будет в реальной среде.
В принципе, есть списки классов, известных как Interpreter
, которые содержат соответствующую информацию для перевода других вещей по программному движку. Для них есть «макет» по умолчанию, но затем во многих особых случаях их нужно переопределить.
Одно решение состоит в том, чтобы иметь только каждый экземпляр в каждом списке (это выполнимо, но я действительно считаю его избыточным, и я думаю, что существует более чистое решение). Вместо этого я хочу «объединить» их, но уметь указывать свойство для использования в качестве «переопределения». (. Полный исходный код доступен на Pastie я бы поставил его здесь, но мне сказали, что положить, что много коды отпугивает человек от ответа на мои вопросы): http://www.pastie.org/1276064
public class Program
{
static void Main()
{
var traits = new List<Trait>
{
new Trait { Name = "Intellect" },
new Trait { Name = "Strength" },
new Trait { Name = "Constitution" }
};
var scores = new List<Score>
{
new Score { Name = "Beginner", Rank = 1 },
new Score { Name = "Adept", Rank = 2 },
new Score { Name = "Expert", Rank = 3 },
new Score { Name = "Master", Rank = 4 }
};
// one sheet will have defaults
var initial = new Sheet
{
Interpreters = new List<Interpreter>
{
new Interpreter
{
Trait = traits.Single(s => s.Name == "Intellect"),
Score = scores.Single(s => s.Rank == 1),
Requirement = 10
},
new Interpreter
{
Trait = traits.Single(s => s.Name == "Intellect"),
Score = scores.Single(s => s.Rank == 2),
Requirement = 20
},
new Interpreter
{
Trait = traits.Single(s => s.Name == "Intellect"),
Score = scores.Single(s => s.Rank == 3),
Requirement = 30
}
}
};
// other sheets will override some or all of the default
var advanced = new Sheet
{
Interpreters = new List<Interpreter>
{
new Interpreter
{
Trait = traits.Single(s => s.Name == "Intellect"),
Score = scores.Single(s => s.Rank == 2),
Requirement = 15
},
new Interpreter
{
Trait = traits.Single(s => s.Name == "Intellect"),
Score = scores.Single(s => s.Rank == 4),
Requirement = 35
}
}
};
// combined sheet should have values of default, with the appropriately 'overridden' values of the advanced
}
В этой ситуации, объединенный список должен читаться как ...
[0]
Trait = Intellect,
Score = 1,
Requirement = 10
[1]
Trait = Intellect,
Score = 2,
Requirement = 15
[2]
Trait = Intellect,
Score = 3,
Requirement = 30
[3]
Trait = Intellect,
Score = 4,
Requirement = 35
Я знаю, как я мог бы достичь этого с помощью этого конкретного примера, конечно. Я могу просто написать метод, который проверяет значение оценки и т. Д. Но я хочу использовать более основанный на конвенциях подход, который я могу использовать несколько более сложным образом. У кого-нибудь есть идеи?
Я не могу использовать словари, потому что это неизбежно будет сериализоваться в базе данных, а Entity Framework в настоящее время не поддерживает Словари в настоящее время, а другие люди в моей группе не будут использовать nHibernate по разным причинам. – Ciel
Это решает проблему, если на «расширенном» листе нет ничего первоначального. Но если расширенный лист имеет что-то дополнительное, он не получает эту информацию. – Ciel
Я обновил его, чтобы быть более понятным. – Ciel