有条件地在赋值语句的左侧选择一个值?

时间:2017-12-04 15:08:31

标签: c#

是否可以有条件地在赋值语句的手边选择一个值(在C#中)?

如果我将两个值之一分配给单个变量,我可以这样做:

var1 = (mode == "A" ? 
          someList.Any(itm => itm.prop == value) : 
          someList.Any(itm => itm.prop == value2)  );

or 

var1 = someList.Any(itm => itm.prop == (mode == "A" ? value : value2));

但是假设我想用一个值填充两个变量之一:

if (mode == "A")
    var1 = someList.Any(itm => itm.prop == value);

if (mode == "B")
    var2 = someList.Any(itm => itm.prop == value);

有没有办法在一行中做到这一点? (非工作)例子:

(mode == "A" ? var1 : var2) = someList.Any(itm => itm.prop == value);

[我知道我可以在从somelist

获取之前引入变量并将其分配给var1或var2
var temp = (mode == "A" ? var1 : var2);
temp = someList.Any(itm => itm.prop == value);

更新 @HimBromBeere - 我知道对作业的目标有限制,我不需要来做这个,我只是想知道是否可能,就像使用条件一样操作员是可能的。

代码片段旨在说明并进一步解释这个问题。

...但我成功地从@EricLippert和@Servy获得了两个精彩,有用的信息: ConditionalAssignment / SelectVariable 函数和C#参考功能。

我可能永远不会使用它们(Eric - 我会坚持使用IF),但它有助于我成长。

感谢大家提供所有有用的反馈。

4 个答案:

答案 0 :(得分:2)

您可以使用辅助方法执行此操作,但请不要这样做。只需像普通的C#代码一样编写代码;如果你想要一个条件赋值,那么用if写一个条件赋值。

辅助方法是:

static void ConditionalAssignment<T>(bool b, ref T v1, ref T v2, T value)
{
  if (b) v1 = value else v2 = value;
}

然后在通话现场

ConditionalAssignment(condition, ref v1, ref v2, value);

一般来说,你做某事的方式&#34;在一行&#34;你做了一个方法,做任何你想做的事,然后调用它。 方法是C#中抽象的基本技术。

在这样的情况下,抽象是一个方法中包含的单个语句,通常更好地将该语句放在行中。这绝对是这种情况。如果您想要if的行为,那么请写一个if

答案 1 :(得分:2)

是,使用C#7.2 / 7.3中引入的a功能。

的通用形式
ref local

可以简化为

if (a)
    b = d;
else
    c = d;
每个this proposal

。虽然尚不清楚何时确切添加它,但在VS 2019上,所有.NET Framework项目都将以7.3为目标,而所有.NET Core项目都将以7.3 / 8.0或更高版本为目标,因此此功能应始终在最新VS上可用。因此,您可以使用

(a? ref b : ref c) = d;

答案 2 :(得分:1)

是的,你可以创建一个变量,它本身就是对另一个变量的引用(而不是一个保存值的变量)。您还可以编写一个方法,根据某些条件返回对一个变量选择的引用。

ref bool SelectVariable(ref bool a, ref bool b)
{
    if (mode == "A")
        return ref a;
    else
        return ref b;
}
ref bool referenceToVariable = ref SelectVariable(ref var1, ref var2);
referenceToVariable = someList.Any(itm => itm.prop == value);

答案 3 :(得分:-1)

        var var1 = "";
        var var2 = "";
        var mode = "A";
        var pointlessVar = "";
        pointlessVar =  mode == "A"  ? var1 = "blah" : var2 = "de blah";