478 votes

Quels sont vos préférés des méthodes d'extension pour C#? (codeplex.com/extensionoverflow)

Nous allons faire une liste de réponses où vous postez votre excellent et favori des méthodes d'extension.

L'exigence est que le code complet doit être publié et un exemple et une explication sur la façon de l'utiliser.

Basé sur le haut intérêt pour ce sujet j'ai en place un Projet Open Source appelé extensionoverflow sur Codeplex.

Veuillez inscrire vos réponses avec une acceptation de mettre le code dans le projet Codeplex.

Merci de publier le code source et non un lien.

Codeplex News:

24.08.2010 La Codeplex page est maintenant ici: http://extensionoverflow.codeplex.com/

11.11.2008 XmlSerialize / XmlDeserialize est maintenant mis en œuvre et de l'Unité Testée.

11.11.2008 Il y a encore de la place pour plus de développeurs. ;-) Inscrivez-vous MAINTENANT!

11.11.2008 Troisième contributer rejoint ExtensionOverflow, bienvenue à BKristensen

11.11.2008 FormatWith est maintenant mis en œuvre et de l'Unité Testée.

09.11.2008 Deuxième contributer rejoint ExtensionOverflow. bienvenue à chakrit.

09.11.2008 Nous avons besoin de plus de développeurs. ;-)

09.11.2008 ThrowIfArgumentIsNull en maintenant mis en œuvre et de l'Unité Testée sur Codeplex.

232voto

Winston Smith Points 12029
public static bool In<T>(this T source, params T[] list)
{
  if(null==source) throw new ArgumentNullException("source");
  return list.Contains(source);
}

Permet moi de remplacer:

if(reallyLongIntegerVariableName == 1 || 
    reallyLongIntegerVariableName == 6 || 
    reallyLongIntegerVariableName == 9 || 
    reallyLongIntegerVariableName == 11)
{
  // do something....
}

and

if(reallyLongStringVariableName == "string1" || 
    reallyLongStringVariableName == "string2" || 
    reallyLongStringVariableName == "string3")
{
  // do something....
}

and

if(reallyLongMethodParameterName == SomeEnum.Value1 || 
    reallyLongMethodParameterName == SomeEnum.Value2 || 
    reallyLongMethodParameterName == SomeEnum.Value3 || 
    reallyLongMethodParameterName == SomeEnum.Value4)
{
  // do something....
}

Avec:

if(reallyLongIntegerVariableName.In(1,6,9,11))
{
      // do something....
}

and

if(reallyLongStringVariableName.In("string1","string2","string3"))
{
      // do something....
}

and

if(reallyLongMethodParameterName.In(SomeEnum.Value1, SomeEnum.Value2, SomeEnum.Value3, SomeEnum.Value4)
{
  // do something....
}

160voto

Jon Skeet Points 692016

J'ai plusieurs méthodes d'extension dans mon MiscUtil projet (source complet est disponible là - je ne vais pas répéter ici). Mes favoris, dont certains concernent d'autres classes (comme les plages):

La Date et l'heure de trucs surtout pour les tests unitaires. Pas sûr que j'avais utiliser en production :)

var birthday = 19.June(1976);
var workingDay = 7.Hours() + 30.Minutes();

Gammes et pas à pas - un énorme merci à Marc Gravel pour son opérateur trucs pour rendre cela possible:

var evenNaturals = 2.To(int.MaxValue).Step(2);
var daysSinceBirth = birthday.To(DateTime.Today).Step(1.Days());

Comparaisons:

var myComparer = ProjectionComparer.Create(Person p => p.Name);
var next = myComparer.ThenBy(p => p.Age);
var reversed = myComparer.Reverse();

La vérification Argument:

x.ThrowIfNull("x");

LINQ to XML appliqué à des types anonymes (ou d'autres types avec des propriétés appropriées):

// <Name>Jon</Name><Age>32</Age>
new { Name="Jon", Age=32}.ToXElements();
// Name="Jon" Age="32" (as XAttributes, obviously)
new { Name="Jon", Age=32}.ToXAttributes()

Pousser LINQ - serait trop long à expliquer ici, mais qu'il recherche.

147voto

chakrit Points 29562

chaîne de caractères.Format raccourci:

public static class StringExtensions
{
    // Enable quick and more natural string.Format calls
    public static string F(this string s, params object[] args)
    {
        return string.Format(s, args);
    }
}

Exemple:

var s = "The co-ordinate is ({0}, {1})".F(point.X, point.Y);

Pour un rapide copier-coller d'aller ici.

Ne trouvez-vous pas plus naturel de type "some string".F("param") au lieu de string.Format("some string", "param") ?

Pour plus lisible le nom, essayez l'une de ces suggestions:

s = "Hello {0} world {1}!".Fmt("Stack", "Overflow");
s = "Hello {0} world {1}!".FormatBy("Stack", "Overflow");
s = "Hello {0} world {1}!".FormatWith("Stack", "Overflow");
s = "Hello {0} world {1}!".Display("Stack", "Overflow");
s = "Hello {0} world {1}!".With("Stack", "Overflow");

..

89voto

xyz Points 9067

Sont ces toute utilisation?

public static bool CoinToss(this Random rng)
{
    return rng.Next(2) == 0;
}

public static T OneOf<T>(this Random rng, params T[] things)
{
    return things[rng.Next(things.Length)];
}

Random rand;
bool luckyDay = rand.CoinToss();
string babyName = rand.OneOf("John", "George", "Radio XBR74 ROCKS!");

76voto

CMS Points 315406
public static class ComparableExtensions
{
  public static bool Between<T>(this T actual, T lower, T upper) where T : IComparable<T>
  {
    return actual.CompareTo(lower) >= 0 && actual.CompareTo(upper) < 0;
  }
}

Exemple:

if (myNumber.Between(3,7))
{
  // ....
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X