2009-05-28 7 views
5

Duplicar posible:
Post your extension goodies for C# .Net (codeplex.com/extensionoverflow)¿Existe una biblioteca de métodos de extensión para C#? o compartir su propia

Soy aficionado a C# 3.0. Una de mis partes favoritas son los métodos de extensión.

Me gusta pensar en los métodos de extensión como funciones de utilidad que pueden aplicarse a una amplia base de clases. Me advierten que esta pregunta es subjetiva y probablemente cerrada, pero creo que es una buena pregunta, porque todos tenemos el código "estándar" para hacer algo relativamente estático como "cadena de escape para XML", pero todavía tengo que encontrar un lugar para recoger estos.

Estoy especialmente interesado en funciones comunes que realizan el registro/depuración/creación de perfiles, manipulación de cadenas y acceso a la base de datos. ¿Hay alguna biblioteca de estos tipos de métodos de extensión en alguna parte?

Editar: moví mis ejemplos de código a una respuesta. (¡Gracias Joel por limpiar el código!)

+0

Por favor, después la "respuesta" parte de su pregunta como respuesta. –

Respuesta

6

Le puede gustar MiscUtil.

Además, mucha gente como ésta:

public static bool IsNullOrEmpty(this string s) 
{ 
    return s == null || s.Length == 0; 
} 

pero desde el 9 de cada 10 veces o más Estoy comprobando que es no nulo o vacío, yo personalmente uso esto:

public static bool HasValue(this string s) 
{ 
    return s != null && s.Length > 0; 
} 

por último, uno que recogió hace poco:

public static bool IsDefault<T>(this T val) 
{ 
    return EqualityComparer<T>.Default.Equals(val, default(T)); 
} 

Funciona para verificar ambos tipos de valores, como DateTime, bool o integer, para sus valores predeterminados, o tipos de referencia como string para null. Incluso funciona en objetos, lo cual es un tanto misterioso.

+0

No es que realmente importe, pero ¿por qué no simplemente "devolver string.IsNullOrEmpty (s)"? –

+0

Usted podría hacer eso también. Por alguna razón, me gusta de esta manera, pero he visto ambas cosas. –

+1

Y en realidad, yo personalmente uso algo un poco diferente, ya que 9 de cada 10 veces estoy comprobando que NO es nulo o está vacío (tiene un valor), el mío se parece más a: public static bool HasValue (this string s) {return s! = null && s.Length> 0; } –

3

Aquí hay un par de las minas:

// returns the number of milliseconds since Jan 1, 1970 (useful for converting C# dates to JS dates) 
public static double UnixTicks(this DateTime dt) 
{ 
    DateTime d1 = new DateTime(1970, 1, 1); 
    DateTime d2 = dt.ToUniversalTime(); 
    TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks); 
    return ts.TotalMilliseconds; 
} 

y una función ToDelimitedString:

// apply this extension to any generic IEnumerable object. 
public static string ToDelimitedString<T>(this IEnumerable<T> source, string delimiter, Func<T, string> action) 
{ 
    if (source == null) 
    { 
     throw new ArgumentException("Source can not be null."); 
    } 

    if (delimiter == null) 
    { 
     throw new ArgumentException("Delimiter can not be null."); 
    } 

    string strAction = string.Empty; 
    string delim = string.Empty; 
    var sb = new StringBuilder(); 

    foreach (var item in source) 
    { 
     strAction = action.Invoke(item); 

     sb.Append(delim); 
     sb.Append(strAction); 
     delim = delimiter; 
    } 
    return sb.ToString(); 
} 
+0

Tenga en cuenta que mi limpieza no coincide exactamente con su comportamiento: no lo hizo añada cualquier cosa si strAction estaba vacío, esto todavía pondrá un artículo vacío allí. –

+0

String.Join es más apropiado en este caso. Voy a publicar un ejemplo aquí en breve. –

+0

Ejemplo publicado. Prefiero usar métodos de biblioteca cuando están disponibles, y pensé que mostraría un ejemplo. –

2

Aquí está escrito ToDelimitedString de Jeff usando string.join:

public static string ToDelimitedString<T>(this IEnumerable<T> source, string delimiter, Func<T, string> action) { 
    // guard clauses for arguments omitted for brevity 

    return String.Join(delimiter, source.Select(action)); 
} 
+0

¿Realmente necesita llamar a ToArray allí? Creo que es mejor dejarlo a string.Join quién lo haría internamente – nawfal

+0

@nawfal - Tienes razón - la llamada a '.ToArray' no es necesaria aquí. Editado. –

Cuestiones relacionadas