C #: легкий доступ к члену одиночной ICollection <>? - PullRequest
0 голосов
/ 17 марта 2010

У меня есть ICollection, который, как я знаю, будет иметь только одного члена. В настоящее время я перебираю его, зная, что цикл будет выполняться только один раз, чтобы получить значение. Есть ли более чистый способ сделать это?

Я мог бы изменить объект persistentState, чтобы он возвращал отдельные значения, но это усложнило бы остальную часть интерфейса. Он получает данные из XML, и по большей части ICollection s подходит.

// worldMapLinks ensured to be a singleton
ICollection<IDictionary<string, string>> worldMapLinks = persistentState.GetAllOfType("worldMapLink");

string levelName = ""; //worldMapLinks.GetEnumerator().Current['filePath'];

// this loop will only run once
foreach (IDictionary<string, string> dict in worldMapLinks) // hacky hack hack hack
{
    levelName = dict["filePath"];
}

// proceed with levelName
loadLevel(levelName);

Вот еще один пример той же проблемы:

// meta will be a singleton
ICollection<IDictionary<string, string>> meta = persistentState.GetAllOfType("meta");
foreach (IDictionary<string, string> dict in meta) // this loop should only run once. HACKS.
{
    currentLevelName = dict["name"];
    currentLevelCaption = dict["teaserCaption"];
}

Еще один пример:

private Vector2 startPositionOfKV(ICollection<IDictionary<string, string>> dicts)
{
    Vector2 result = new Vector2();
    foreach (IDictionary<string, string> dict in dicts) // this loop will only ever run once
    {
        result.X = Single.Parse(dict["x"]);
        result.Y = Single.Parse(dict["y"]);
    }

    return result;
}

Ответы [ 3 ]

4 голосов
/ 17 марта 2010

Почему бы не использовать методы расширения Single или FirstOrDefault?

var levelName = worldMapLinks.Single().Value;

Сингл имеет преимущество в применении вашего предположения, что в перечислении есть только 1 значение. Если это не так, то возникнет исключение, заставляющее вас пересмотреть свою логику. FirstOrDefault вернет значение по умолчанию, если в перечислении нет хотя бы одного элемента.

0 голосов
/ 17 марта 2010

Почему у вас есть коллекция только с одним участником? Кажется, что реальный ответ должен быть лучше спроектировать вашу систему, а не полагаться на какой-либо метод получения одного элемента из коллекции. Вы говорите, что это усложняет, но как? Разве это решение само по себе не является осложнением? Можно ли изменить интерфейс для возврата одного элемента, где это применимо, и коллекции в другом месте? Для меня это похоже на запах кода.

0 голосов
/ 17 марта 2010

Если вы можете использовать LINQ-to-objects в своем классе, используйте метод расширения Single () для коллекции, если вы знаете, что будет ровно один член. В противном случае, если может быть ноль или единица, используйте SingleOrDefault ()

...