C# 无法编译通过FirstOrDefault和direct increment搜索值的字典
我们正在努力改进代码,并对C#编译器/visual studio错误的某些行为感到疑惑 长话短说,下面是一些复制行为的示例代码:C# 无法编译通过FirstOrDefault和direct increment搜索值的字典,c#,.net,dictionary,increment,C#,.net,Dictionary,Increment,我们正在努力改进代码,并对C#编译器/visual studio错误的某些行为感到疑惑 长话短说,下面是一些复制行为的示例代码: using System.Collections.Generic; using System.Linq; namespace ConsoleApp { class Program { private static Dictionary<int?, DictObject> testDict; static
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp
{
class Program
{
private static Dictionary<int?, DictObject> testDict;
static void Main(string[] args)
{
var testObject = new DictObject { SearchIndex = "TestSearch2", Counter = 0 };
testDict = new Dictionary<int?, DictObject>
{
{ 0, testObject }
};
//works
var testKey = testDict.FirstOrDefault(x => x.Value.SearchIndex.Equals("TestSearch")).Key;
if (testKey != null) testDict[testKey].Counter++;
//does not work. Exception "Value is null" (okay, that's expected).
testDict.FirstOrDefault(x => x.Value.SearchIndex.Equals("TestSearch")).Value.Counter++;
//solution with ? operator -> or not ?!
//compiler error: "the operand of an increment or decrement operator must be a variable, propery or indexer.
testDict.FirstOrDefault(x => x.Value.SearchIndex.Equals("TestSearch")).Value?.Counter++;
}
}
public class DictObject
{
public string SearchIndex { get; set; }
public int Counter { get; set; }
}
}
也不起作用:“不能将?运算符应用于KeyValuePair类型的操作数”
你能告诉我我们的错误在哪里吗?是否可以在一行中编写dictionary firstordefault增量语句
提前感谢,,
Martin最简单的修复方法可能是添加一个步骤:
var obj=testDict.FirstOrDefault(x=>x.Value.SearchIndex.Equals(“TestSearch”).Value;
如果(obj!=null)对象计数器++;
最简单的修复方法可能是添加一个步骤:
var obj=testDict.FirstOrDefault(x=>x.Value.SearchIndex.Equals(“TestSearch”).Value;
如果(obj!=null)对象计数器++;
这是因为您有?。
编译器不知道当您执行null++
时该怎么做,因为FirstOrDefault()永远不会返回null,因为它会返回一个结构。在这种情况下,我想知道您将如何判断是否找到任何匹配的值?@veetanrbadar:但确实如此。尝试在第二个testDict.FirstOrDefault(x=>x.Value.SearchIndex.Equals(“TestSearch”)).Value.Counter++中执行上述代码;您将得到一个值为null的错误。这是完全不同的,KVP本身永远不会为null。你的方法考虑不周。它返回的默认KVP的值为null。你永远不会知道你是否找到了你要找的对象。@NetMage通常,查询字典的方法是通过键相等,这就是优化为O(1)的方法。是的,您可以扫描O(N)的数据,但这通常意味着您错过了一个技巧。这是因为您有?。
编译器不知道当您执行null++
时该怎么做,因为FirstOrDefault()永远不会返回null,因为在这种情况下它会返回一个结构,我想知道你怎么才能知道你是否找到了匹配的值?@TanveerBadar:但确实如此。尝试在第二个testDict.FirstOrDefault(x=>x.Value.SearchIndex.Equals(“TestSearch”)).Value.Counter++中执行上述代码;您将得到一个值为null的错误。这是完全不同的,KVP本身永远不会为null。你的方法考虑不周。它返回的默认KVP的值为null。你永远不会知道你是否找到了你要找的对象。@NetMage通常,查询字典的方法是通过键相等,这就是优化为O(1)的方法。是的,您可以扫描O(N)的数据,但这通常意味着您错过了一个技巧。这是一个解决方案,但并不比我们的“获取密钥,检查密钥是否为null,然后使用密钥访问dict”更好。一个单行解决方案会很好,但我怀疑没有。我们想知道++操作符是否对可空类型有问题……对于未来的读者:不要!字典没有第一个/最后一个元素的概念,请注意!在这个特定的示例中,如果您的值是值类型,那么您就完蛋了。编译器只会警告您不应将其与null进行比较,但您将得到返回的默认对象FirstOrDefault()的副本。突变不会有持久的效果,简言之就是一个bug。如果你已经把事情搞砸了,那么你可能也没有任何测试用例来解决这个问题。@TanveerBadar我同意你的观点,也许Single[OrDefault]
更适合这里,但是First[OrDefault]
如果我们接受最多有一个匹配的前提(因此顺序是不相关的)就可以了我们想早点休息;至于值类型位:您是对的,但在所示的示例中,它显然是一个类
。坦白地说,更好的建议是“没有可变结构”,然后它在.Counter++
point@NetMage我在回复另一条评论时说“如果你的值是值类型,你就完蛋了。”这是一个解决方案,但并不比我们的“获取密钥,检查密钥是否不为null,然后使用密钥访问dict”更好. 一个单行解决方案会很好,但我怀疑没有。我们想知道++操作符是否对可空类型有问题……对于未来的读者:不要!字典没有第一个/最后一个元素的概念,请注意!在这个特定的示例中,如果您的值是值类型,那么您就完蛋了。编译器只会警告您不应将其与null进行比较,但您将得到返回的默认对象FirstOrDefault()的副本。突变不会有持久的效果,简言之就是一个bug。如果你已经把事情搞砸了,那么你可能也没有任何测试用例来解决这个问题。@TanveerBadar我同意你的观点,也许Single[OrDefault]
更适合这里,但是First[OrDefault]
如果我们接受最多有一个匹配的前提(因此顺序是不相关的)就可以了我们想早点休息;至于值类型位:您是对的,但在所示的示例中,它显然是一个类
。坦白地说,更好的建议是“没有可变结构”,然后它在.Counter++
point@NetMage我是在回应另一条评论:“如果你的价值观是一种价值观类型,你就完蛋了。”
testDict.FirstOrDefault(x => x.Value.SearchIndex.Equals("TestSearch"))?.Value.Counter++;