Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# 无法编译通过FirstOrDefault和direct increment搜索值的字典_C#_.net_Dictionary_Increment - Fatal编程技术网

C# 无法编译通过FirstOrDefault和direct increment搜索值的字典

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

我们正在努力改进代码,并对C#编译器/visual studio错误的某些行为感到疑惑

长话短说,下面是一些复制行为的示例代码:

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++;