Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:轻松访问singleton ICollection的成员<>;?_C#_Syntax_Coding Style - Fatal编程技术网

C#:轻松访问singleton ICollection的成员<>;?

C#:轻松访问singleton ICollection的成员<>;?,c#,syntax,coding-style,C#,Syntax,Coding Style,我有一个I集合,我知道它只会有一个成员。目前,我循环它,知道循环只会运行一次,以获取值。有没有更干净的方法 我可以更改persistentState对象以返回单个值,但这会使接口的其余部分变得复杂。它从XML中获取数据,在大多数情况下,ICollections是合适的 // worldMapLinks ensured to be a singleton ICollection<IDictionary<string, string>> worldMapLinks = per

我有一个
I集合
,我知道它只会有一个成员。目前,我循环它,知道循环只会运行一次,以获取值。有没有更干净的方法

我可以更改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);
//确保worldMapLinks为单例
ICollection worldMapLinks=persistentState.GetAllOfType(“worldMapLink”);
字符串levelName=“”//worldMapLinks.GetEnumerator().Current['filePath'];
//此循环只运行一次
foreach(worldMapLinks中的字典dict)//hacky-hack
{
levelName=dict[“文件路径”];
}
//继续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"];
}
//meta将是一个单例
ICollection meta=persistentState.GetAllOfType(“meta”);
foreach(元中的IDictionary dict)//此循环只应运行一次。黑客。
{
currentLevelName=dict[“name”];
currentLevelCaption=dict[“摘要选项”];
}
还有一个例子:

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;
}
private Vector2开始位置FKV(ICollection dicts)
{
Vector2结果=新Vector2();
foreach(dictionary dict in dicts)//此循环只运行一次
{
result.X=Single.Parse(dict[“X”]);
result.Y=Single.Parse(dict[“Y”]);
}
返回结果;
}

为什么不使用Single或FirstOrDefault扩展方法

var levelName = worldMapLinks.Single().Value;

Single的优点是强制执行枚举中只有1个值的假设。如果这不是真的,将引发异常,迫使您重新考虑您的逻辑。如果枚举中至少没有1个元素,FirstOrDefault将返回默认值

为什么不使用Single或FirstOrDefault扩展方法

var levelName = worldMapLinks.Single().Value;

Single的优点是强制执行枚举中只有1个值的假设。如果这不是真的,将引发异常,迫使您重新考虑您的逻辑。如果枚举中至少没有1个元素,FirstOrDefault将返回默认值

如果您可以在类中使用LINQ to对象,那么如果您知道只有一个成员,请在集合上使用Single()扩展方法。否则,如果可能有零个或一个,请使用SingleOrDefault()

如果您可以在类中使用LINQ to对象,如果您知道只有一个成员,请在集合上使用Single()扩展方法。否则,如果可能有零个或一个,请使用SingleOrDefault()

为什么只有一个成员的集合?似乎真正的答案应该是更好地设计系统,而不是依赖任何方法从集合中检索一个元素。你说这会让事情变得更复杂,但怎么会呢?这个解决方案本身不是一个复杂问题吗?是否可以更改接口以在适用的情况下返回一个元素,并在其他地方返回一个集合?对我来说似乎是一种代码味道。

为什么你的收藏只有一个成员?似乎真正的答案应该是更好地设计系统,而不是依赖任何方法从集合中检索一个元素。你说这会让事情变得更复杂,但怎么会呢?这个解决方案本身不是一个复杂问题吗?是否可以更改接口以在适用的情况下返回一个元素,并在其他地方返回一个集合?对我来说,这似乎是一种代码味道。

这是绝对可能的,但使用@JaredPar的答案现在似乎更好。我同意。看起来,如果有一种情况,当你知道你只会收到一个元素,这是一个提示,有一个更好的语义选择。在其他情况下,可能会返回大量集合,但我认为不同的方法适用于这些情况。这当然是可能的,但使用@JaredPar的答案现在似乎更好。我同意。看起来,如果有一种情况,当你知道你只会收到一个元素,这是一个提示,有一个更好的语义选择。在其他情况下,可能会返回大型集合,但我认为不同的方法适用于这些情况。