[英]Conditionally choose a value on the left hand side of an assignment statement?
是否可以有條件地選擇賦值語句左側的值(在 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# ref函數。
我可能永遠不會使用它們(Eric - 我會堅持 IF),但它幫助我成長。
感謝大家提供所有有用的反饋。
您可以使用輔助方法執行此操作,但請不要這樣做。 只需像普通的 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);
一般來說,你“在一行中”做某事的方式是創建一個方法,可以做任何你想做的事情,然后調用它。 方法是 C# 中抽象的基本技術。
在這種抽象是包含在方法中的單個語句的情況下,通常最好將該語句放在 line 中。 這絕對是這樣的情況。 如果你想要一個if
的行為,那么就寫一個if
please。
是的,使用 C# 7.2/7.3 中引入的ref local
功能。 的一般形式
if (a)
b = d;
else
c = d;
可以簡化為
(a? ref b : ref c) = d;
根據這個提議。 雖然不清楚何時確切添加,但在 VS 2019 上,所有 .NET Framework 項目都將面向 7.3,所有 .NET Core 項目將面向 7.3/8.0 或更高版本,因此此功能應始終在最新的 VS 上可用。 因此,您可以使用
(mode == "A" ? ref var1 : ref var2) = someList.Any(itm => itm.prop == value);
是的,您可以創建一個變量,該變量本身就是對另一個變量(而不是保存值的變量)的引用。 您還可以編寫一個方法,該方法根據某些條件返回對選擇的變量之一的引用。
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);
var var1 = "";
var var2 = "";
var mode = "A";
var pointlessVar = "";
pointlessVar = mode == "A" ? var1 = "blah" : var2 = "de blah";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.