簡體   English   中英

有條件地選擇賦值語句左側的值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM