SORU
21 EKİM 2008, Salı


En verimli şekilde DBNull için kontrol edin ve bir değişken atayın.

Bu soru ara sıra gelir, ama tatmin edici bir cevap görmedim.

Tipik bir model (bir satırDataRow):

 if (row["value"] != DBNull.Value)
 {
      someObject.Member = row["value"];
 }

İlk sorum daha verimli (koşul takla atıyorum) ise:

  row["value"] == DBNull.Value; // Or
  row["value"] is DBNull; // Or
  row["value"].GetType() == typeof(DBNull) // Or... any suggestions?

This gösterir .() GetType daha hızlı olması gerekir, ama belki derleyici bilmiyorum bir kaç numara biliyor musun?

Satır değerini önbellekleme değer mi"value" veya derleyici, dizin zaten optimize mu? ikinci soru

Örneğin:

  object valueHolder;
  if (DBNull.Value == (valueHolder = row["value"])) {}

Notlar:

  1. ["değer"] var. satır
  2. Sütun (bu sütun adı arama) sütun dizini bilmiyorum.
  3. Özellikle DBNull ve ödev hakkında değil erken optimizasyon, vb.) merak ettiğim için soruyorum.

Bir kaç senaryo (saniye cinsinden zaman, 10,000,000 denemeler) kriterlerini esas:

row["value"] == DBNull.Value: 00:00:01.5478995
row["value"] is DBNull: 00:00:01.6306578
row["value"].GetType() == typeof(DBNull): 00:00:02.0138757

Nesne.ReferenceEquals aynı performansı olarak "=="

En ilginç sonuç? Dava ile sütun (örneğin, "" yerine"", kabaca on kat daha uzun sürer (bir dize): . değer adı uyuşmazlığı varsa

row["Value"] == DBNull.Value: 00:00:12.2792374

Bu hikayenin ana fikri ise onun dizine göre sütun, sütun, dizin yem DataColumn adı ile eşleşir adı emin olun tam olarak o zaman eğer sen-ebilmek değil gibi görünüyor.

Değerini önbellekleme de neredeyse görünüyoriki kezhızlı olarak:

No Caching: 00:00:03.0996622
With Caching: 00:00:01.5659920

En etkili yöntemgörünüyorolmak:

 object temp;
 string variable;
 if (DBNull.Value != (temp = row["value"]))
 {
      variable = temp.ToString();
 }

CEVAP
16 HAZİRAN 2010, ÇARŞAMBA


Ben bir şey eksik olmalı. Tam olarak DataRow.IsNull yöntemi nedir DBNull kontrol değil mi?

Aşağıdaki iki uzatma yöntemleri kullanıyorum:

public static T? GetValue<T>(this DataRow row, string columnName) where T : struct
{
    if (row.IsNull(columnName))
        return null;

    return row[columnName] as T?;
}

public static string GetText(this DataRow row, string columnName)
{
    if (row.IsNull(columnName))
        return string.Empty;

    return row[columnName] as string ?? string.Empty;
}

Kullanımı:

int? id = row.GetValue<int>("Id");
string name = row.GetText("Name");
double? price = row.GetValue<double>("Price");

Eğer GetValue<T> Nullable<T> dönüş değerleri istemedin bile kolayca ** 23 veya başka bir seçenek yerine dönebilirsin.


Tamamen alakasız olarak, burada Stevo3000 önerisini VB.NET bir alternatif var:

oSomeObject.IntMember = If(TryConvert(Of Integer)(oRow("Value")), iDefault)
oSomeObject.StringMember = If(TryCast(oRow("Name"), String), sDefault)

Function TryConvert(Of T As Structure)(ByVal obj As Object) As T?
    If TypeOf obj Is T Then
        Return New T?(DirectCast(obj, T))
    Else
        Return Nothing
    End If
End Function

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Droid Life

    Droid Life

    17 Kasım 2009
  • PUSHER

    PUSHER

    11 HAZİRAN 2014
  • Wild Academy

    Wild Academy

    8 Aralık 2009