我正在使用字典来执行我正在处理的程序的查找.我在字典中运行了一堆密钥,我希望某些密钥没有值.我抓住KeyNotFoundException
它发生的右边,然后吸收它.所有其他异常将传播到顶部.这是处理这个问题的最佳方法吗?或者我应该使用不同的查找?该字典使用int作为其键,并使用自定义类作为其值.
A System.Collections.Generic.Dictionary
正在投掷KeyNotFoundException
,但我看不出哪个密钥应该丢失.我该如何确定?
我发现自己有很多小烦恼 - 我有一个Dictionary<TKey, TValue>
包含值可能存在或不存在的值.
所以正常的行为是使用索引器,如下所示:
object result = myDictionary["key"];
Run Code Online (Sandbox Code Playgroud)
但是,如果"key"
不在字典中,则抛出a KeyNotFoundException
,所以你这样做:
object val;
if (!myDictionary.TryGetValue("key", out val))
{
val = ifNotFound;
}
Run Code Online (Sandbox Code Playgroud)
哪个好,除了我可以连续加载这些 - TryGetValue
开始觉得可怕的笨重.
因此选项1是一种扩展方法:
public static TValue TryGet<TKey, TValue>(
this Dictionary<TKey, TValue> input,
TKey key,
TValue ifNotFound = default(TValue))
{
TValue val;
if (input.TryGetValue(key, out val))
{
return val;
}
return ifNotFound;
}
Run Code Online (Sandbox Code Playgroud)
这让我做:
object result = myDictionary.TryGet("key1") ?? ifNotFound;
int i = anotherDictionary.TryGet("key2", -1);
Run Code Online (Sandbox Code Playgroud)
这很简单,但是名称类似于现有实例方法的附加扩展方法可能会增加混淆并降低可维护性.它也与字典的索引器集不一致 - 它将处理丢失的密钥.
所以选项2是一个新的实现,IDictionary<TKey, TValue>
带有隐式转换, …
我目前正在研究用C#4.0编写的刮刀.我使用各种工具,包括.NET的内置WebClient和RegEx功能.对于我的刮刀的一部分,我正在使用HtmlAgilityPack解析HTML文档.我按照自己的意愿完成了所有工作,并完成了一些代码清理工作.
我正在使用该HtmlEntity.DeEntitize()
方法来清理HTML.我做了一些测试,这个方法看起来效果很好.但是当我在我的代码中实现该方法时,我一直在努力KeyNotFoundException
.没有进一步的细节,所以我很丢失.我的代码看起来像这样:
WebClient client = new WebClient();
string html = HtmlEntity.DeEntitize(client.DownloadString(path));
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
Run Code Online (Sandbox Code Playgroud)
下载的HTML是UTF-8编码的.我怎样才能解决这个KeyNotFound
异常?
我可以发誓我已经使用 NUnit 的 Assert.Throws 来确定某个方法是否抛出特定的异常,但我的记忆以前已经失败了。我在 SO 上阅读了这篇文章,但它没有回答我的问题,因为我知道正确的语法,并且我不想对返回的异常执行任何操作(我不想查看异常的成员,尽管这可能会很有用)。
我编写了单元测试来证明我对 Dictionary 的使用缺乏理解,并且无法让它处理抛出的 KeyNotFoundException。我在运行时遇到了未处理的 KeyNotFoundException 错误,而不是 NUnit 捕获它并通过测试。我确认我没有将 VS IDE 设置为在抛出的 .NET 异常时中断。
我尝试过这两种方法:
Assert.Throws( typeof(KeyNotFoundException), () => value = prefs["doesn't exist"]);
Run Code Online (Sandbox Code Playgroud)
和
Assert.Throws<KeyNotFoundException>( () => value = prefs["doesn't exist"]);
Run Code Online (Sandbox Code Playgroud)
但两者都会导致未处理的异常。我在这里缺少什么?
更新似乎其他人无法重现这一点。这是一个屏幕截图:
nunit dictionary unit-testing exception keynotfoundexception
我目前正在使用Xamarin Studio,我正在使用MvvmCross框架开发应用程序.
我的问题是,当我尝试在名为"Views"的文件夹中创建一个新文件时,命名空间不包含".Views".
我有Xamarin.Client.iOS而不是Xamarin.Client.iOS.Views.所以MvvmCross框架找不到我的观点并返回一个KeyNotFoundException : could not find view for [MyViewModel]
我想知道XCode是否修改了我的命名空间,因为我的应用程序运行良好,现在无法找到视图.
我想这是一个命名空间问题,但不是很确定.事实是我的"View"文件在"Views"文件夹中不在".Views"命名空间中.
如何使用良好的命名空间创建我的视图?因为在.cs和.designer.cs文件中更改它不会修复KeyNotFoundException ...
如果你有任何想法......
当我做val = dict ["不存在的密钥"]时,我得到System.Collections.Generic.KeyNotFoundException有没有办法让我的字典调用成员函数,并将密钥作为生成值的参数?
-edit-也许我应该更具体一点.我想AUTOMATICALLY调用一个成员函数来做它需要的东西,为那个键创建正确的值.在这种情况下,它在我的数据库中创建一个条目然后给我回到它的独特句柄.我将在下面发布我的解决方案.
我准备好把头撞在墙上
我有一个名为Map的类,它有一个名为tiles的字典.
class Map
{
public Dictionary<Location, Tile> tiles = new Dictionary<Location, Tile>();
public Size mapSize;
public Map(Size size)
{
this.mapSize = size;
}
//etc...
Run Code Online (Sandbox Code Playgroud)
我暂时填写这本字典来测试一些东西..
public void FillTemp(Dictionary<int, Item> itemInfo)
{
Random r = new Random();
for(int i =0; i < mapSize.Width; i++)
{
for(int j=0; j<mapSize.Height; j++)
{
Location temp = new Location(i, j, 0);
int rint = r.Next(0, (itemInfo.Count - 1));
Tile t = new Tile(new Item(rint, rint));
tiles[temp] = t;
}
}
}
Run Code Online (Sandbox Code Playgroud)
并在我的主程序代码中
Map m …
Run Code Online (Sandbox Code Playgroud) 我是CRM开发的新手.我有一个自定义实体"客户".该实体有一个名为"defaultcustomer"的字段,可以是TRUE或FALSE.我正在使用插件,我需要为所有"客户"将"defaultcustomer"设置为FALSE.我这样做如下:
事实:
我已经为实体"客户"本身注册了插件.因此,当实体"客户"更新时,插件将触发.
private void MakeAllNonDefault()
{
try
{
QueryExpression query = new QueryExpression("customer");
query.ColumnSet = new ColumnSet("defaultcustomer");
EntityCollection retrieved = service.RetrieveMultiple(query);
foreach (Entity myCustomer in retrieved.Entities)
{
myCustomer["defaultcustomer"] = false;
service.Update(myCustomer);
}
}
catch (Exception ex)
{
throw new InvalidPluginExecutionException("An error occurred in MakeAllNonDefault(): " + ex.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
错误: 它会在此行引发错误:
myCustomer["defaultcustomer"] = false;
System.Collections.Generic.KeyNotFoundException:
The given key was not present in the dictionary.
Run Code Online (Sandbox Code Playgroud) 我是一个业余程序员,这似乎是一个简单的问题需要解决,但我无法弄清楚如何.下面是C#代码,它不像我想要的那样.我希望这会返回3,而是抛出一个KeyNotFoundException
.列表是相同的,所以不应该返回3?谢谢你的帮助.
Dictionary<object, double> dict = new Dictionary<object, double>();
dict.Add(new List<object>() { "a", "b" }, 3);
double output = dict[new List<object>() { "a", "b" }];
Run Code Online (Sandbox Code Playgroud) 我有一些代码,给定一个ID,从数据库中返回一个项目.如果没有项目与给定的ID匹配,是否适合抛出一个KeyNotFoundException
,或者这样的异常仅适用于Dictionary类型?
c# ×8
dictionary ×5
.net ×3
exception ×3
.net-4.0 ×1
delegates ×1
equals ×1
ios ×1
mvvmcross ×1
namespaces ×1
nunit ×1
unit-testing ×1
xamarin ×1