相关疑难解决方法(0)

什么是更好的方法来避免do-while(0); hack in C++?

当代码流是这样的:

if(check())
{
  ...
  ...
  if(check())
  {
    ...
    ...
    if(check())
    {
      ...
      ...
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我一般都看到这个工作,以避免上面的凌乱的代码流:

do {
    if(!check()) break;
    ...
    ...
    if(!check()) break;
    ...
    ...
    if(!check()) break;
    ...
    ...
} while(0);
Run Code Online (Sandbox Code Playgroud)

有哪些更好的方法可以避免这种解决方案/黑客攻击,从而使其成为更高级别(行业级别)的代码?

任何开箱即用的建议都是受欢迎的!

c++ do-while

232
推荐指数
17
解决办法
2万
查看次数

更清洁的方法在C#中进行空检查?

假设,我有这个界面,

interface IContact
{
    IAddress address { get; set; }
}

interface IAddress
{
    string city { get; set; }
}

class Person : IPerson
{
    public IContact contact { get; set; }
}

class test
{
    private test()
    {
        var person = new Person();
        if (person.contact.address.city != null)
        {
            //this will never work if contact is itself null?
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Person.Contact.Address.City != null (这可以检查City是否为空.)

但是,如果Address或Contact或Person本身为null,则此检查将失败.

目前,我能想到的一个解决方案是:

if (Person != null && Person.Contact!=null && Person.Contact.Address!= null && Person.Contact.Address.City != …
Run Code Online (Sandbox Code Playgroud)

c# null .net-4.0 .net-4.5

180
推荐指数
9
解决办法
8万
查看次数

C#中的| =和&=赋值运算符短路

我知道,||&&在C#中被定义为短路运营商,这种行为是由语言规范保证,但做|=&=短路呢?

例如:

private bool IsEven(int n)
{
    return n % 2 == 0;
}

private void Main()
{
    var numbers = new int[] { 2, 4, 6, 8, 9, 10, 14, 16, 17, 18, 20 };

    bool allEven = true;
    bool anyOdd = false;

    for (int i = 0; i < numbers.Length; i++)
    {
        allEven &= IsEven(numbers[i]);
        anyOdd |= !IsEven(numbers[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

当9条目被命中时,allEven变为false,这意味着所有后续条目都是无关紧要的 - allEven对于将来对该表达式的所有调用,该值保证为false.同样如此anyOdd,当它看到9时设置为true,并且对于该表达式的所有后续调用将保持为true.

那么,做&= …

c# short-circuiting

22
推荐指数
4
解决办法
5187
查看次数

检查嵌套字典中的密钥是否存在

我正在使用API​​调用,因此使用Python字典.

但是,对于相同的请求,我并不总是键入相同的键,我想知道何时可以在没有异常的情况下调用键...

让我说我有

test = {'a':{'b':{'c':{'d':'e'}}}}
Run Code Online (Sandbox Code Playgroud)

有时密钥d会存在,有时则不会.有时c甚至不存在.

我想以某种方式test['a']['b']['c']['d']在一行中检查是否存在.

到目前为止我尝试过的:

  • test.get('a', {}).get('b', {}).get('c', {}).get('d', {}).工作正常,但它是一个烂摊子,有时我有5-6个嵌套的词典,名字很长......

  • 使用try/except块很好,但通常如果test['a']['b']['c']['d']不存在,我会尝试调用test['a']['b']['e']['f']检查是否存在,因此我需要为每个if语句添加一个try/catch,就好像我没有错,如果异常是catch,则不再执行try块.

我可能试图寻找一种反身的方式来做这件事,调用一个函数,将我的"对象"的名称作为字符串,检查每个键是否存在,如果存在,则返回对象本身.

有什么想法吗 ?

它背后的用法是,省略无用的情况,并假设有时信息在测试['a'] ['b'] ['c'] ['d'],有时在测试['a'] [' b'] ['f']:

if test['a']['b']['c']['d'] **exists**:
    do sthg with the value of test['a']['b']['c']['d']
elif test['a']['b']['f'] **exists**:
    do sthg else with the value of test['a']['b']['f']
else:
    do sthg different
Run Code Online (Sandbox Code Playgroud)

如果我把try/except放在那里,第一个异常不会停止执行并且不让我执行elif吗?

而且,我真的很喜欢打电话的方式而test['a']['b']['c']['d']不是给出一个按键列表.事实上,我希望它对我和那些阅读/使用我的代码的人们尽可能透明.

谢谢 !

python json

7
推荐指数
1
解决办法
1346
查看次数

简化长嵌套if语句工作流程C#

该程序用于验证Excel行数据.如果if语句为false,我需要将消息附加到字符串,依此类推N个if语句.这不起作用,因为你可以看到第一个if语句是否失败,我不会继续查看其他if语句.后来,我需要处理100多列,所以我正在寻找一种方法来做到这一点.

有没有其他方法可以重写这个,所以它更具可读性和重复性?我知道我可以做一个巨大的if(.... && ....)来验证所有单元格和if if语句来附加消息,但我想知道是否还有另一种方法可以做到这一点.我想保留错误的顺序,但这并不重要.结果就像"facilityID is invalid, daysOfTheWeek is invalid"我还返回一个自定义Pair数据类型.

string facilityID, facilityDockDoorID, increment, hoursOfOperationId, updatedById, startTime, endTime, dockDoorServiceType, daysOfTheWeek;
            facilityID = row[0];
            facilityDockDoorID = row[1];
            increment = row[2];
            hoursOfOperationId = row[3];
            updatedById = row[4];
            startTime = row[5];
            endTime = row[6];
            dockDoorServiceType = row[7];
            daysOfTheWeek = row[8];

            string errorMessage = " is invalid";
            if (IsInt(facilityID))
            {
                if (IsInt(facilityDockDoorID))
                {
                    if (IsInt(increment))
                    {
                        if (IsInt(hoursOfOperationId))
                        {
                            if (IsInt(updatedById))
                            {
                                if (IsTime(startTime))
                                {
                                    if (IsTime(endTime))
                                    {
                                        if (IsValidDockDoorServiceType(dockDoorServiceType))
                                        {
                                            if …
Run Code Online (Sandbox Code Playgroud)

c# if-statement

0
推荐指数
1
解决办法
164
查看次数

标签 统计

c# ×3

.net-4.0 ×1

.net-4.5 ×1

c++ ×1

do-while ×1

if-statement ×1

json ×1

null ×1

python ×1

short-circuiting ×1