我有一個處理各種型別的大量資料的通用方法。
double當資料是特定型別時(在這種情況下),我想應用一些額外的處理。所有其他功能在不同型別中都是相同的。
有沒有比下面示例中所示的(非常慢的)裝箱/拆箱更好的方法?
這似乎意味著我們需要在斷言這一點的部分中讓編譯器相信T和double是同一型別。if..else
public static T[] HalfIfDouble<T>(T[] data)
{
T[] result;
if (typeof(T) == typeof(double))
{
// result = data.Select(x => x * 0.5).ToArray(); // does not compile
result = data.Select(x =>
{
double d = (double)(object)x;
return (T)(object)(d * 0.5);
}).ToArray();
}
else
{
result = data;
}
// do some more processing...
return result;
}
真正的功能顯然比這個例子更復雜。
需要在 .NET Framework 和 .NET 6 中作業。
uj5u.com熱心網友回復:
您可以使用as運算子而不是(T).
- 在運算式中,如果可能,
value as T它將嘗試轉換value為型別T,否則值為null. as僅在轉換為參考型別(在您的情況下為陣列)時才可用。
您還可以使用is運算子來替換型別檢查。
- 在運算式中,如果可以強制轉換為型別,
value is T則運算式將為真。valueT - 在運算式
value as T tValue中,如果value可以將運算式強制轉換為型別,則運算式將為真T,并且變數tValue將被分配 的值(T)value。
使用這些運算子更新您的代碼,我們得到:
- 如果在 .Net Framework 或 .Net 中并且可以為空的參考型別被禁用:
public static T[] HalfIfDouble<T>(T[] data)
{
T[] result;
if (data is double[] da)
{
result = da.Select(x => x * 0.5).ToArray() as T[];
}
else
{
result = data;
}
// do some more processing...
return result;
}
- 如果在 .Net 中啟用了可為空的參考型別:
- 這使用null-forgiving 運算子
!告訴編譯器as T[]永遠不會回傳null。- 啟用可為空的參考型別時會
as T[]導致結果,T[]?因為如果轉換失敗,則結果為null. - 我們知道它不會導致,
null因為我們知道T是doublefromdata is double[]所以我們可以安全地使用它。
- 啟用可為空的參考型別時會
public static T[] HalfIfDouble<T>(T[] data)
{
T[] result;
if (data is double[] da)
{
result = (da.Select(x => x * 0.5).ToArray() as T[])!;
}
else
{
result = data;
}
// do some more processing...
return result;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/526819.html
標籤:C#仿制药
