加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 捕获null-coalescing运算符中左手项成功分配的变量

发布时间:2020-12-15 08:47:06 所属栏目:百科 来源:网络整理
导读:我正在使用??运算符尝试根据列表中找到的最佳匹配来分配对象. 我有各种匹配规则,但为此示例简化了这一点: objectImTryingToSet =MyListOfPotentialMatches.FirstOrDefault(*/lamda checking numerous things*/) ?? //rule1MyListOfPotentialMatches.FirstOr
我正在使用??运算符尝试根据列表中找到的最佳匹配来分配对象.

我有各种匹配规则,但为此示例简化了这一点:

objectImTryingToSet =
MyListOfPotentialMatches.FirstOrDefault(*/lamda checking numerous things*/) ??                  //rule1
MyListOfPotentialMatches.FirstOrDefault(*/lamda checking different numerous things*/) ??        //rule2
MyListOfPotentialMatches.FirstOrDefault(*/lamda checking again different numerous things*/);    //rule3

出于调试的目的,我想存储一个字符串日志记录,哪个规则是成功分配了objectImTryingToSet的规则,因为我在一个场景中有一个bug wherby,当它不应该被分配时,它是一个真正令人头疼的手动尝试筛选通过所有这些规则来找出错误分配的位置.

所以我基本上想要,伪:

string ruleThatMatched = null;

objectImTryingToSet =
MyListOfPotentialMatches.FirstOrDefault(*/lamda checking numerous things*/) ??  if (objectImTryingToSet != null) { ruleThatMatched = "rule1" }                 //rule1
MyListOfPotentialMatches.FirstOrDefault(*/lamda checking different numerous things*/) ??  if (objectImTryingToSet != null) { ruleThatMatched = "rule2" }       //rule2
MyListOfPotentialMatches.FirstOrDefault(*/lamda checking again different numerous things*/); if (objectImTryingToSet != null) { ruleThatMatched = "rule3"}     //rule3

//tried all the rules and still no match
if (objectImTryingToSet == null)
{
    ruleThatMatched = "no rule managed to find a match";
}

这甚至可以用??操作符?

解决方法

你可以这样做:
var res =
    MyListOfPotentialMatches.Select(v => new {r=1,v}).FirstOrDefault(/*lamda checking numerous things*/) ??
    MyListOfPotentialMatches.Select(v => new {r=2,v}).FirstOrDefault(/*lamda checking different numerous things*/) ??
    MyListOfPotentialMatches.Select(v => new {r=3,v}).FirstOrDefault(/*lamda checking again different numerous things*/);
if (res != null) {
    var ruleNumber = res.r;
    objectImTryingToSet = res.v;
}

关键是Select,它将结果与硬编码规则编号配对.

请注意,你可以不用??操作符:

var firstChoice = MyListOfPotentialMatches.Select(v => new {r=1,v}).Where(/*lamda checking numerous things*/);
var secondChoice = MyListOfPotentialMatches.Select(v => new {r=2,v}).Where(/*lamda checking different numerous things*/);
var thirdChoice = MyListOfPotentialMatches.Select(v => new {r=3,v}).Where(/*lamda checking again different numerous things*/);
var res = firstChoice.Concat(secondChoice).Concat(thirdChoice).FirstOrDefault();
if (res != null) {
    var ruleNumber = res.r;
    objectImTryingToSet = res.v;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读