2009-05-28 8 views
5

Eventuali duplicati:
Post your extension goodies for C# .Net (codeplex.com/extensionoverflow)Esiste una libreria esistente di metodi di estensione per C#? o condividere il tuo

Sono appassionato di C# 3.0. Una delle mie parti preferite è i metodi di estensione.

Mi piace pensare ai metodi di estensione come funzioni di utilità che possono essere applicate a un'ampia base di classi. Sono stato avvertito che questa domanda è soggettiva e probabilmente chiusa, ma penso che sia una buona domanda, perché tutti abbiamo il codice "boilerplate" per fare qualcosa di relativamente statico come "escape string per XML" - ma devo ancora trovare un posto dove ritirarli.

Sono particolarmente interessato alle funzioni comuni che eseguono il logging/debugging/profiling, la manipolazione delle stringhe e l'accesso al database. C'è qualche libreria di questi tipi di metodi di estensione là fuori da qualche parte?

Modifica: ha spostato gli esempi di codice in una risposta. (Grazie Joel per la pulizia del codice!)

+0

Si prega di inviare la "risposta" parte della tua domanda come risposta. –

risposta

6

Potrebbe piacerti MiscUtil.

Inoltre, un sacco di gente come questa:

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

ma dal momento che 9 volte su 10 o più sto controllando che è non nullo o vuoto, io personalmente uso questo:

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

Infine, uno ho preso da poco:

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

Funziona per controllare entrambi i tipi di valore come DateTime, bool o integer per i loro valori predefiniti, o tipi di riferimento come string per null. Funziona anche su oggetti, il che è piuttosto inquietante.

+0

Non è importante, ma perché non dovresti semplicemente "restituire string.IsNullOrEmpty (s)"? –

+0

Puoi farlo anche tu. Per qualche motivo mi piace così, ma ho visto entrambi. –

+1

E in realtà, io personalmente uso qualcosa di un po 'diverso, dal momento che 9 volte su 10 sto verificando che NON è nullo o vuoto (ha un valore), il mio sembra più simile: public static boV HasValue (this string s) {return s! = null && s.Length> 0; } –

3

Ecco un paio di mine:

// 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; 
} 

e una funzione 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

Nota che il mio clean up non corrisponde esattamente al tuo comportamento: non lo hai aggiungi qualcosa se strAction era vuoto, questo verrà comunque inserito un elemento vuoto lì. –

+0

String.Join è più appropriato in questo caso - posterò un esempio qui a breve. –

+0

Esempio pubblicato. Preferisco usare i metodi di libreria quando disponibili, e ho pensato di mostrare un esempio. –

2

Ecco ToDelimitedString di Jeff scritto 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

Hai davvero bisogno che ToArray venga chiamato lì? Penso che sia meglio lasciarlo a stringhe.Join chi lo farebbe internamente – nawfal

+0

@nawfal - Hai ragione - la chiamata a '.ToArray' non è necessaria qui. Modificato. –

Problemi correlati