是否可以有条件地在赋值语句的左手边选择一个值(在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或var2var temp = (mode == "A" ? var1 : var2);
temp = someList.Any(itm => itm.prop == value);
更新 @HimBromBeere - 我知道对作业的目标有限制,我不需要来做这个,我只是想知道是否可能,就像使用条件一样操作员是可能的。
代码片段旨在说明并进一步解释这个问题。
...但我成功地从@EricLippert和@Servy获得了两个精彩,有用的信息: ConditionalAssignment / SelectVariable 函数和C#参考功能。
我可能永远不会使用它们(Eric - 我会坚持使用IF),但它有助于我成长。
感谢大家提供所有有用的反馈。
答案 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";