दिलचस्प पोस्ट
एसटीएल नक्शा -> मूल्य के आधार पर? जेपीए (एक्लेप्सेलिंक) में कैशिंग अक्षम करें एंड्रॉइड: कोई पूर्ण पाठ दर्ज नहीं होने पर स्वत: पूर्ण पाठक सुझाव दिखाएं सामान्य संख्या के लिए एक फ़ंक्शन कैसे लिखूँ? Math.max.apply () कैसे काम करता है? बंडलर अलग प्लेटफार्मों के लिए अलग रत्नों का उपयोग करें जेपीए 2.0: स्थिरता के लिए इकाई वर्गों को जोड़ने- अलग-अलग जार से * यूनिट * स्वचालित रूप से एंड्रॉइड में अलार्म मैनेजर का उपयोग कैसे करना है? जावा में एक सूची को कैसे सीरियल करना है? कैसे linq में linq में शामिल करने के लिए विधि वाक्यविन्यास के साथ एसक्यूएल? क्यों stdin से मेरा उपयोगकर्ता इनपुट सही ढंग से मैच नहीं करता? JSF2.0 से दृश्य परिभाषा भाषा के रूप में जेएसपी पर क्यों फेसलेट पसंदीदा हैं? टर्मिनल पर पासवर्ड इनपुट छुपाएं सूची देखें फिर से विचारों का पुन: उपयोग करते समय … मुझे यह नहीं चाहिए डुप्लिकेट कुंजी पर ध्यान न दें?

सी # के लिए आपके पसंदीदा एक्सटेंशन विधियां क्या हैं? (codeplex.com/extensionoverflow)

चलिए उन उत्तरों की एक सूची बनाते हैं जहां आप अपने उत्कृष्ट और पसंदीदा विस्तार विधियों को पोस्ट करते हैं।

आवश्यकता यह है कि पूर्ण कोड पोस्ट किया जाना चाहिए और इसका उपयोग कैसे करें इसका उदाहरण और एक स्पष्टीकरण।

इस विषय में उच्च रुचि के आधार पर मैंने कोडप्लेक्स पर एक्सटेंशन ओवरफ्लो नामक एक ओपन सोर्स प्रोजेक्ट सेट किया है

कृपया Codeplex प्रोजेक्ट में कोड डाल करने के लिए स्वीकृति के साथ अपने उत्तरों को चिह्नित करें।

कृपया पूर्ण स्रोत कोड पोस्ट करें और एक लिंक न करें

कोडप्लेक्स न्यूज:

24.08.2010 कोडप्लेक्स पृष्ठ अब यहां है: http://extensionoverflow.codeplex.com/

11.11.2008 एक्सएमएल सेरिअलाइज़ / एक्सएमएलडीएसरिअलाइज अब कार्यान्वित और यूनिट टेस्ट किया गया है ।

11.11.2008 अधिक डेवलपर्स के लिए अभी भी कमरा है 😉 अब जुड़ें!

11.11.2008 तीसरे योगदानकर्ता एक्सटेंशनऑवरफ्लो में शामिल हुए, बी के क्रिस्टेंसेन में आपका स्वागत है

11.11.2008 प्रारूप अब कार्यान्वित और इकाई परीक्षण किया गया है ।

09.11.2008 दूसरा योगदानकर्ता एक्सटेंशनऑवरफ्लो में शामिल हो गया चकृत में आपका स्वागत है

09.11.2008 हमें और डेवलपर्स की आवश्यकता है 😉

09.11.2008 ThrowIfArgumentIsNull में अब कार्यान्वित और यूनिवर्स Codeplex पर परीक्षण किया।

वेब के समाधान से एकत्रित समाधान "सी # के लिए आपके पसंदीदा एक्सटेंशन विधियां क्या हैं? (codeplex.com/extensionoverflow)"

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

मुझे बदलने की अनुमति देता है:

 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.... } 

साथ में:

 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.... } 

मेरे विविध युटिल परियोजना में मेरे पास विभिन्न विस्तार विधियां हैं (पूर्ण स्रोत वहां उपलब्ध है – मैं इसे यहाँ दोहराने नहीं जा रहा हूं)। मेरे पसंदीदा, इनमें से कुछ अन्य वर्गों (जैसे श्रेणियों) को शामिल करते हैं:

दिनांक और समय सामग्री – ज्यादातर यूनिट परीक्षणों के लिए। निश्चित नहीं है कि मैं उनका उपयोग उत्पादन में करूंगा 🙂

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

रेंज और कदम – इस ऑपरेटर सामग्री के लिए मार्क ग्रेवेल को बहुत धन्यवाद, यह संभव बनाने के लिए:

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

तुलना:

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

तर्क जाँच:

 x.ThrowIfNull("x"); 

LINQ से XML को अनाम प्रकारों (या अन्य प्रकार के उपयुक्त गुणों) पर लागू किया गया है:

 // <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() 

पुश LINQ – यहां व्याख्या करने में बहुत अधिक समय लगेगा, लेकिन इसके लिए खोज करें।

स्ट्रिंगफ़ॉर्मेट शॉर्टकट:

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

उदाहरण:

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

त्वरित कॉपी और पेस्ट के लिए यहां जाएं

"some string".F("param") बजाय "some string".F("param") टाइप करने के लिए आपको इसे अधिक स्वाभाविक नहीं लगता है। string.Format("some string", "param") बजाय?

अधिक पठनीय नाम के लिए, इनमें से एक सुझाव आज़माएं:

 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"); 

..

क्या ये कोई उपयोग हैं?

 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!"); 
 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; } } 

उदाहरण:

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

एक्सटेंशन विधि:

 public static void AddRange<T, S>(this ICollection<T> list, params S[] values) where S : T { foreach (S value in values) list.Add(value); } 

यह विधि सभी प्रकारों के लिए लागू होती है और आपको पैरामीटर के रूप में एक सूची में कई मदों को जोड़ने देता है

उदाहरण:

 var list = new List<Int32>(); list.AddRange(5, 4, 8, 4, 2); 

हर तरह से यह codeplex परियोजना में डाल दिया।

सीरियलाइजिंग / डिसेराइलाइजिंग ऑब्जेक्ट्स एक्सएमएल:

 /// <summary>Serializes an object of type T in to an xml string</summary> /// <typeparam name="T">Any class type</typeparam> /// <param name="obj">Object to serialize</param> /// <returns>A string that represents Xml, empty otherwise</returns> public static string XmlSerialize<T>(this T obj) where T : class, new() { if (obj == null) throw new ArgumentNullException("obj"); var serializer = new XmlSerializer(typeof(T)); using (var writer = new StringWriter()) { serializer.Serialize(writer, obj); return writer.ToString(); } } /// <summary>Deserializes an xml string in to an object of Type T</summary> /// <typeparam name="T">Any class type</typeparam> /// <param name="xml">Xml as string to deserialize from</param> /// <returns>A new object of type T is successful, null if failed</returns> public static T XmlDeserialize<T>(this string xml) where T : class, new() { if (xml == null) throw new ArgumentNullException("xml"); var serializer = new XmlSerializer(typeof(T)); using (var reader = new StringReader(xml)) { try { return (T)serializer.Deserialize(reader); } catch { return null; } // Could not be deserialized to this type. } } 

IEnumerables के लिए प्रत्येक के लिए

 public static class FrameworkExtensions { // a map function public static void ForEach<T>(this IEnumerable<T> @enum, Action<T> mapFunction) { foreach (var item in @enum) mapFunction(item); } } 

सार्थक उदाहरण:

 var buttons = GetListOfButtons() as IEnumerable<Button>; // click all buttons buttons.ForEach(b => b.Click()); 

अच्छा उदाहरण:

 // no need to type the same assignment 3 times, just // new[] up an array and use foreach + lambda // everything is properly inferred by csc :-) new { itemA, itemB, itemC } .ForEach(item => { item.Number = 1; item.Str = "Hello World!"; }); 

ध्यान दें:

यह ऐसा Select नहीं है, क्योंकि Select को आपके फ़ंक्शन को किसी अन्य सूची में बदलने के लिए कुछ वापस करने की उम्मीद है

के लिए हर आसानी से आप किसी भी परिवर्तन / डेटा हेरफेर के बिना प्रत्येक आइटम के लिए कुछ निष्पादित करने की अनुमति देता है।

मैंने इसे बनाया है इसलिए मैं एक अधिक कार्यात्मक शैली में प्रोग्राम कर सकता हूं और मुझे आश्चर्य था कि सूची में एक forEach है जबकि IEnumerable नहीं है।

इसे कोडप्लेक्स प्रोजेक्ट में रखें

मेरा रूपांतरण एक्सटेंशन जो आपको करने की अनुमति देता है:

 int i = myString.To<int>(); 

TheSoftwareJedi.com पर पोस्ट के रूप में यहां यह है

 public static T To<T>(this IConvertible obj) { return (T)Convert.ChangeType(obj, typeof(T)); } public static T ToOrDefault<T> (this IConvertible obj) { try { return To<T>(obj); } catch { return default(T); } } public static bool ToOrDefault<T> (this IConvertible obj, out T newObj) { try { newObj = To<T>(obj); return true; } catch { newObj = default(T); return false; } } public static T ToOrOther<T> (this IConvertible obj, T other) { try { return To<T>obj); } catch { return other; } } public static bool ToOrOther<T> (this IConvertible obj, out T newObj, T other) { try { newObj = To<T>(obj); return true; } catch { newObj = other; return false; } } public static T ToOrNull<T> (this IConvertible obj) where T : class { try { return To<T>(obj); } catch { return null; } } public static bool ToOrNull<T> (this IConvertible obj, out T newObj) where T : class { try { newObj = To<T>(obj); return true; } catch { newObj = null; return false; } } 

विफलता पर आप डिफ़ॉल्ट (कॉल रिक्त कन्स्ट्रक्टर या "0" संख्याओं के लिए कॉल कर सकते हैं), "डिफ़ॉल्ट" मान निर्दिष्ट करें (मैं इसे "अन्य" कहता हूं), या रिक्त (जहां टी: वर्ग) के लिए पूछें। मैंने दोनों चुप्पी अपवाद मॉडल भी प्रदान किए हैं, और एक विशिष्ट TryParse मॉडल जो एक बूल वापस लाता है जो कार्रवाई की गई है, और एक बाहरी परम के पास नए मान हैं। तो हमारा कोड इस तरह से काम कर सकता है

 int i = myString.To<int>(); string a = myInt.ToOrDefault<string>(); //note type inference DateTime d = myString.ToOrOther(DateTime.MAX_VALUE); double d; //note type inference bool didItGiveDefault = myString.ToOrDefault(out d); string s = myDateTime.ToOrNull<string>(); 

मैं पूरी तरह से पूरी तरह से सही ढंग से रोल करने के लिए नल योग्य प्रकार प्राप्त नहीं कर सका। तौलिया में फेंकने से पहले मैंने करीब 20 मिनट की कोशिश की

मेरे पास लॉगिंग अपवादों के लिए एक एक्सटेंशन विधि है:

 public static void Log(this Exception obj) { //your logging logic here } 

और इसका प्रयोग इस प्रकार किया जाता है:

 try { //Your stuff here } catch(Exception ex) { ex.Log(); } 

[दो बार पोस्ट करने के लिए खेद है; दूसरा एक बेहतर डिजाइन किया गया है :-)]

 public static class StringExtensions { /// <summary> /// Parses a string into an Enum /// </summary> /// <typeparam name="T">The type of the Enum</typeparam> /// <param name="value">String value to parse</param> /// <returns>The Enum corresponding to the stringExtensions</returns> public static T EnumParse<T>(this string value) { return StringExtensions.EnumParse<T>(value, false); } public static T EnumParse<T>(this string value, bool ignorecase) { if (value == null) { throw new ArgumentNullException("value"); } value = value.Trim(); if (value.Length == 0) { throw new ArgumentException("Must specify valid information for parsing in the string.", "value"); } Type t = typeof(T); if (!t.IsEnum) { throw new ArgumentException("Type provided must be an Enum.", "T"); } return (T)Enum.Parse(t, value, ignorecase); } } 

एनाम में एक स्ट्रिंग पार्स करने के लिए उपयोगी

 public enum TestEnum { Bar, Test } public class Test { public void Test() { TestEnum foo = "Test".EnumParse<TestEnum>(); } } 

क्रेडिट स्कॉट डॉर्मन को जाता है

कोडप्लेक्स परियोजना के लिए — संपादित करें —

मैंने स्कॉट डोरमैन से पूछा है कि क्या वह हमें कोडपेलक्स प्रोजेक्ट में अपने कोड को प्रकाशित करने के लिए दिमाग देगा। यह वह उत्तर है जिसे मैं उससे प्राप्त करता हूं:

एसओ पोस्ट और कोडपेल दोनों परियोजनाओं पर सिर के लिए धन्यवाद। मैंने आपके उत्तर को सवाल पर उठाया है हाँ, कोड वर्तमान में CodeProject ओपन लाइसेंस ( http://www.codeproject.com/info/cpol10.aspx ) के तहत सार्वजनिक डोमेन में है

मुझे CodePlex प्रोजेक्ट में शामिल होने में कोई समस्या नहीं है, और अगर आप मुझे परियोजना में जोड़ना चाहते हैं (यूज़रनेम नाम है sdorman) मैं उस विधि को जोड़ देगा, साथ ही साथ कुछ अतिरिक्त enum सहायक विधियों।

मैं यह एक बहुत उपयोगी खोज:

 public static class PaulaBean { private static String paula = "Brillant"; public static String GetPaula<T>(this T obj) { return paula; } } 

आप इसे CodePlex पर उपयोग कर सकते हैं

DateTimeExtensions

उदाहरण:

 DateTime firstDayOfMonth = DateTime.Now.First(); DateTime lastdayOfMonth = DateTime.Now.Last(); DateTime lastFridayInMonth = DateTime.Now.Last(DayOfWeek.Friday); DateTime nextFriday = DateTime.Now.Next(DayOfWeek.Friday); DateTime lunchTime = DateTime.Now.SetTime(11, 30); DateTime noonOnFriday = DateTime.Now.Next(DayOfWeek.Friday).Noon(); DateTime secondMondayOfMonth = DateTime.Now.First(DayOfWeek.Monday).Next(DayOfWeek.Monday).Midnight(); 

gitorious.org/cadenza मैं देखा है सबसे उपयोगी विस्तार तरीकों में से कुछ की एक पूरी लाइब्रेरी है।

यहां प्रस्तुति स्वरूपण के लिए मैं अक्सर उपयोग करता हूं I

 public static string ToTitleCase(this string mText) { if (mText == null) return mText; System.Globalization.CultureInfo cultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture; System.Globalization.TextInfo textInfo = cultureInfo.TextInfo; // TextInfo.ToTitleCase only operates on the string if is all lower case, otherwise it returns the string unchanged. return textInfo.ToTitleCase(mText.ToLower()); } 

यहां रोमन अंकों के लिए एक-और-से-एक है अक्सर इस्तेमाल नहीं किया जाता, लेकिन आसान हो सकता है उपयोग:

 if ("IV".IsValidRomanNumeral()) { // Do useful stuff with the number 4. } Console.WriteLine("MMMDCCCLXXXVIII".ParseRomanNumeral()); Console.WriteLine(3888.ToRomanNumeralString()); 

स्रोत:

  public static class RomanNumeralExtensions { private const int NumberOfRomanNumeralMaps = 13; private static readonly Dictionary<string, int> romanNumerals = new Dictionary<string, int>(NumberOfRomanNumeralMaps) { { "M", 1000 }, { "CM", 900 }, { "D", 500 }, { "CD", 400 }, { "C", 100 }, { "XC", 90 }, { "L", 50 }, { "XL", 40 }, { "X", 10 }, { "IX", 9 }, { "V", 5 }, { "IV", 4 }, { "I", 1 } }; private static readonly Regex validRomanNumeral = new Regex( "^(?i:(?=[MDCLXVI])((M{0,3})((C[DM])|(D?C{0,3}))" + "?((X[LC])|(L?XX{0,2})|L)?((I[VX])|(V?(II{0,2}))|V)?))$", RegexOptions.Compiled); public static bool IsValidRomanNumeral(this string value) { return validRomanNumeral.IsMatch(value); } public static int ParseRomanNumeral(this string value) { if (value == null) { throw new ArgumentNullException("value"); } value = value.ToUpperInvariant().Trim(); var length = value.Length; if ((length == 0) || !value.IsValidRomanNumeral()) { throw new ArgumentException("Empty or invalid Roman numeral string.", "value"); } var total = 0; var i = length; while (i > 0) { var digit = romanNumerals[value[--i].ToString()]; if (i > 0) { var previousDigit = romanNumerals[value[i - 1].ToString()]; if (previousDigit < digit) { digit -= previousDigit; i--; } } total += digit; } return total; } public static string ToRomanNumeralString(this int value) { const int MinValue = 1; const int MaxValue = 3999; if ((value < MinValue) || (value > MaxValue)) { throw new ArgumentOutOfRangeException("value", value, "Argument out of Roman numeral range."); } const int MaxRomanNumeralLength = 15; var sb = new StringBuilder(MaxRomanNumeralLength); foreach (var pair in romanNumerals) { while (value / pair.Value > 0) { sb.Append(pair.Key); value -= pair.Value; } } return sb.ToString(); } } 

आकारों से निपटने का एक सुविधाजनक तरीका:

 public static class Extensions { public static int K(this int value) { return value * 1024; } public static int M(this int value) { return value * 1024 * 1024; } } public class Program { public void Main() { WSHttpContextBinding serviceMultipleTokenBinding = new WSHttpContextBinding() { MaxBufferPoolSize = 2.M(), // instead of 2097152 MaxReceivedMessageSize = 64.K(), // instead of 65536 }; } } 

विनफ़ॉर्म नियंत्रण के लिए:

 /// <summary> /// Returns whether the function is being executed during design time in Visual Studio. /// </summary> public static bool IsDesignTime(this Control control) { if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) { return true; } if (control.Site != null && control.Site.DesignMode) { return true; } var parent = control.Parent; while (parent != null) { if (parent.Site != null && parent.Site.DesignMode) { return true; } parent = parent.Parent; } return false; } /// <summary> /// Sets the DropDownWidth to ensure that no item's text is cut off. /// </summary> public static void SetDropDownWidth(this ComboBox comboBox) { var g = comboBox.CreateGraphics(); var font = comboBox.Font; float maxWidth = 0; foreach (var item in comboBox.Items) { maxWidth = Math.Max(maxWidth, g.MeasureString(item.ToString(), font).Width); } if (comboBox.Items.Count > comboBox.MaxDropDownItems) { maxWidth += SystemInformation.VerticalScrollBarWidth; } comboBox.DropDownWidth = Math.Max(comboBox.Width, Convert.ToInt32(maxWidth)); } 

IsDesignTime उपयोग:

 public class SomeForm : Form { public SomeForm() { InitializeComponent(); if (this.IsDesignTime()) { return; } // Do something that makes the visual studio crash or hang if we're in design time, // but any other time executes just fine } } 

SetDropdownWidth उपयोग:

 ComboBox cbo = new ComboBox { Width = 50 }; cbo.Items.Add("Short"); cbo.Items.Add("A little longer"); cbo.Items.Add("Holy cow, this is a really, really long item. How in the world will it fit?"); cbo.SetDropDownWidth(); 

मैं उल्लेख करना भूल गया, कोडप्लेक्स पर इनका उपयोग करने में संकोच न करें …

ThrowIfArgumentIsNull यह एक निरर्थक तरीका है जो हम सभी को करना चाहिए।

 public static class Extensions { public static void ThrowIfArgumentIsNull<T>(this T obj, string parameterName) where T : class { if (obj == null) throw new ArgumentNullException(parameterName + " not allowed to be null"); } } 

नीचे इसका प्रयोग करने का तरीका है और यह आपके नामस्थान में या जहां भी आप अपने नाम स्थान का उपयोग करते हैं, सभी वर्गों पर काम करता है।

 internal class Test { public Test(string input1) { input1.ThrowIfArgumentIsNull("input1"); } } 

CodePlex प्रोजेक्ट पर इस कोड का उपयोग करना ठीक है I

सी # पर जाने के समय मैं विज़ुअल बेसिक के स्टेटमेंट को याद करता हूं, तो यह यहां जाता है:

 public static void With<T>(this T obj, Action<T> act) { act(obj); } 

और यहाँ सी # में इसका उपयोग कैसे किया जाता है:

 someVeryVeryLonggggVariableName.With(x => { x.Int = 123; x.Str = "Hello"; x.Str2 = " World!"; }); 

बहुत सारे टाइपिंग बचाता है!

इसके साथ तुलना करें:

 someVeryVeryLonggggVariableName.Int = 123; someVeryVeryLonggggVariableName.Str = "Hello"; someVeryVeryLonggggVariableName.Str2 = " World!"; 

कोडप्लेक्स परियोजना में डाल दिया

Takes a camelCaseWord or PascalCaseWord and "wordifies" it, ie camelCaseWord => camel Case Word

 public static string Wordify( this string camelCaseWord ) { // if the word is all upper, just return it if( !Regex.IsMatch( camelCaseWord, "[az]" ) ) return camelCaseWord; return string.Join( " ", Regex.Split( camelCaseWord, @"(?<!^)(?=[AZ])" ) ); } 

I often use it in conjuction with Capitalize

 public static string Capitalize( this string word ) { return word[0].ToString( ).ToUpper( ) + word.Substring( 1 ); } 

उदाहरण उपयोग

 SomeEntityObject entity = DataAccessObject.GetSomeEntityObject( id ); List<PropertyInfo> properties = entity.GetType().GetPublicNonCollectionProperties( ); // wordify the property names to act as column headers for an html table or something List<string> columns = properties.Select( p => p.Name.Capitalize( ).Wordify( ) ).ToList( ); 

Free to use in codeplex project

I found this one helpful

 public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> pSeq) { return pSeq ?? Enumerable.Empty<T>(); } 

It removes the null check in the calling code. You could now do

 MyList.EmptyIfNull().Where(....) 

Convert a double to string formatted using the specified culture:

 public static class ExtensionMethods { public static string ToCurrency(this double value, string cultureName) { CultureInfo currentCulture = new CultureInfo(cultureName); return (string.Format(currentCulture, "{0:C}", value)); } } 

उदाहरण:

 double test = 154.20; string testString = test.ToCurrency("en-US"); // $154.20 

Below is an extension method that adapts Rick Strahl's code (and the comments too) to stop you having to guess or read the byte order mark of a byte array or text file each time you convert it to a string.

The snippet allows you to simply do:

 byte[] buffer = File.ReadAllBytes(@"C:\file.txt"); string content = buffer.GetString(); 

If you find any bugs please add to the comments. Feel free to include it in the Codeplex project.

 public static class Extensions { /// <summary> /// Converts a byte array to a string, using its byte order mark to convert it to the right encoding. /// Original article: http://www.west-wind.com/WebLog/posts/197245.aspx /// </summary> /// <param name="buffer">An array of bytes to convert</param> /// <returns>The byte as a string.</returns> public static string GetString(this byte[] buffer) { if (buffer == null || buffer.Length == 0) return ""; // Ansi as default Encoding encoding = Encoding.Default; /* EF BB BF UTF-8 FF FE UTF-16 little endian FE FF UTF-16 big endian FF FE 00 00 UTF-32, little endian 00 00 FE FF UTF-32, big-endian */ if (buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf) encoding = Encoding.UTF8; else if (buffer[0] == 0xfe && buffer[1] == 0xff) encoding = Encoding.Unicode; else if (buffer[0] == 0xfe && buffer[1] == 0xff) encoding = Encoding.BigEndianUnicode; // utf-16be else if (buffer[0] == 0 && buffer[1] == 0 && buffer[2] == 0xfe && buffer[3] == 0xff) encoding = Encoding.UTF32; else if (buffer[0] == 0x2b && buffer[1] == 0x2f && buffer[2] == 0x76) encoding = Encoding.UTF7; using (MemoryStream stream = new MemoryStream()) { stream.Write(buffer, 0, buffer.Length); stream.Seek(0, SeekOrigin.Begin); using (StreamReader reader = new StreamReader(stream, encoding)) { return reader.ReadToEnd(); } } } } 

Here's one I just created today.

 // requires .NET 4 public static TReturn NullOr<TIn, TReturn>(this TIn obj, Func<TIn, TReturn> func, TReturn elseValue = default(TReturn)) where TIn : class { return obj != null ? func(obj) : elseValue; } // versions for CLR 2, which doesn't support optional params public static TReturn NullOr<TIn, TReturn>(this TIn obj, Func<TIn, TReturn> func, TReturn elseValue) where TIn : class { return obj != null ? func(obj) : elseValue; } public static TReturn NullOr<TIn, TReturn>(this TIn obj, Func<TIn, TReturn> func) where TIn : class { return obj != null ? func(obj) : default(TReturn); } 

It lets you do this:

 var lname = thingy.NullOr(t => t.Name).NullOr(n => n.ToLower()); 

which is more fluent and (IMO) easier to read than this:

 var lname = (thingy != null ? thingy.Name : null) != null ? thingy.Name.ToLower() : null; 

"Please mark your answers with an acceptance to put the code in the Codeplex project."

क्यूं कर? All the Stuff on this site under CC-by-sa-2.5 , so just put your Extension overflow Project under the same license and you can freely use it.

Anyway, here is a String.Reverse function, based on this question .

 /// <summary> /// Reverse a String /// </summary> /// <param name="input">The string to Reverse</param> /// <returns>The reversed String</returns> public static string Reverse(this string input) { char[] array = input.ToCharArray(); Array.Reverse(array); return new string(array); } 

I got tired of tedious null-checking while pulling values from MySqlDataReader, so:

 public static DateTime? GetNullableDateTime(this MySqlDataReader dr, string fieldName) { DateTime? nullDate = null; return dr.IsDBNull(dr.GetOrdinal(fieldName)) ? nullDate : dr.GetDateTime(fieldName); } public static string GetNullableString(this MySqlDataReader dr, string fieldName) { return dr.IsDBNull(dr.GetOrdinal(fieldName)) ? String.Empty : dr.GetString(fieldName); } public static char? GetNullableChar(this MySqlDataReader dr, string fieldName) { char? nullChar = null; return dr.IsDBNull(dr.GetOrdinal(fieldName)) ? nullChar : dr.GetChar(fieldName); } 

Of course this could be used with any SqlDataReader.


Both hangy and Joe had some good comments on how to do this, and I have since had an opportunity to implement something similar in a different context, so here is another version:

 public static int? GetNullableInt32(this IDataRecord dr, int ordinal) { int? nullInt = null; return dr.IsDBNull(ordinal) ? nullInt : dr.GetInt32(ordinal); } public static int? GetNullableInt32(this IDataRecord dr, string fieldname) { int ordinal = dr.GetOrdinal(fieldname); return dr.GetNullableInt32(ordinal); } public static bool? GetNullableBoolean(this IDataRecord dr, int ordinal) { bool? nullBool = null; return dr.IsDBNull(ordinal) ? nullBool : dr.GetBoolean(ordinal); } public static bool? GetNullableBoolean(this IDataRecord dr, string fieldname) { int ordinal = dr.GetOrdinal(fieldname); return dr.GetNullableBoolean(ordinal); } 

It irritated me that LINQ gives me an OrderBy that takes a class implementing IComparer as an argument, but does not support passing in a simple anonymous comparer function. I rectified that.

This class creates an IComparer from your comparer function…

 /// <summary> /// Creates an <see cref="IComparer{T}"/> instance for the given /// delegate function. /// </summary> internal class ComparerFactory<T> : IComparer<T> { public static IComparer<T> Create(Func<T, T, int> comparison) { return new ComparerFactory<T>(comparison); } private readonly Func<T, T, int> _comparison; private ComparerFactory(Func<T, T, int> comparison) { _comparison = comparison; } #region IComparer<T> Members public int Compare(T x, T y) { return _comparison(x, y); } #endregion } 

…and these extension methods expose my new OrderBy overloads on enumerables. I doubt this works for LINQ to SQL, but it's great for LINQ to Objects.

 public static class EnumerableExtensions { /// <summary> /// Sorts the elements of a sequence in ascending order by using a specified comparison delegate. /// </summary> public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TKey, TKey, int> comparison) { var comparer = ComparerFactory<TKey>.Create(comparison); return source.OrderBy(keySelector, comparer); } /// <summary> /// Sorts the elements of a sequence in descending order by using a specified comparison delegate. /// </summary> public static IOrderedEnumerable<TSource> OrderByDescending<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TKey, TKey, int> comparison) { var comparer = ComparerFactory<TKey>.Create(comparison); return source.OrderByDescending(keySelector, comparer); } } 

You're welcome to put this on codeplex if you like.

This one is for MVC it adds the ability to generate a <label /> tag to the Html variable that is available in every ViewPage . Hopefully it will be of use to others trying to develop similar extensions.

उपयोग:

 <%= Html.Label("LabelId", "ForId", "Text")%> 

आउटपुट:

 <label id="LabelId" for="ForId">Text</label> 

कोड:

 public static class HtmlHelperExtensions { public static string Label(this HtmlHelper Html, string @for, string text) { return Html.Label(null, @for, text); } public static string Label(this HtmlHelper Html, string @for, string text, object htmlAttributes) { return Html.Label(null, @for, text, htmlAttributes); } public static string Label(this HtmlHelper Html, string @for, string text, IDictionary<string, object> htmlAttributes) { return Html.Label(null, @for, text, htmlAttributes); } public static string Label(this HtmlHelper Html, string id, string @for, string text) { return Html.Label(id, @for, text, null); } public static string Label(this HtmlHelper Html, string id, string @for, string text, object htmlAttributes) { return Html.Label(id, @for, text, new RouteValueDictionary(htmlAttributes)); } public static string Label(this HtmlHelper Html, string id, string @for, string text, IDictionary<string, object> htmlAttributes) { TagBuilder tag = new TagBuilder("label"); tag.MergeAttributes(htmlAttributes); if (!string.IsNullOrEmpty(id)) tag.MergeAttribute("id", Html.AttributeEncode(id)); tag.MergeAttribute("for", Html.AttributeEncode(@for)); tag.SetInnerText(Html.Encode(text)); return tag.ToString(TagRenderMode.Normal); } } 

Turn this:

 DbCommand command = connection.CreateCommand(); command.CommandText = "SELECT @param"; DbParameter param = command.CreateParameter(); param.ParameterName = "@param"; param.Value = "Hello World"; command.Parameters.Add(param); 

… into this:

 DbCommand command = connection.CreateCommand("SELECT {0}", "Hello World"); 

… using this extension method:

 using System; using System.Data.Common; using System.Globalization; using System.Reflection; namespace DbExtensions { public static class Db { static readonly Func<DbConnection, DbProviderFactory> getDbProviderFactory; static readonly Func<DbCommandBuilder, int, string> getParameterName; static readonly Func<DbCommandBuilder, int, string> getParameterPlaceholder; static Db() { getDbProviderFactory = (Func<DbConnection, DbProviderFactory>)Delegate.CreateDelegate(typeof(Func<DbConnection, DbProviderFactory>), typeof(DbConnection).GetProperty("DbProviderFactory", BindingFlags.Instance | BindingFlags.NonPublic).GetGetMethod(true)); getParameterName = (Func<DbCommandBuilder, int, string>)Delegate.CreateDelegate(typeof(Func<DbCommandBuilder, int, string>), typeof(DbCommandBuilder).GetMethod("GetParameterName", BindingFlags.Instance | BindingFlags.NonPublic, Type.DefaultBinder, new Type[] { typeof(Int32) }, null)); getParameterPlaceholder = (Func<DbCommandBuilder, int, string>)Delegate.CreateDelegate(typeof(Func<DbCommandBuilder, int, string>), typeof(DbCommandBuilder).GetMethod("GetParameterPlaceholder", BindingFlags.Instance | BindingFlags.NonPublic, Type.DefaultBinder, new Type[] { typeof(Int32) }, null)); } public static DbProviderFactory GetProviderFactory(this DbConnection connection) { return getDbProviderFactory(connection); } public static DbCommand CreateCommand(this DbConnection connection, string commandText, params object[] parameters) { if (connection == null) throw new ArgumentNullException("connection"); return CreateCommandImpl(GetProviderFactory(connection).CreateCommandBuilder(), connection.CreateCommand(), commandText, parameters); } private static DbCommand CreateCommandImpl(DbCommandBuilder commandBuilder, DbCommand command, string commandText, params object[] parameters) { if (commandBuilder == null) throw new ArgumentNullException("commandBuilder"); if (command == null) throw new ArgumentNullException("command"); if (commandText == null) throw new ArgumentNullException("commandText"); if (parameters == null || parameters.Length == 0) { command.CommandText = commandText; return command; } object[] paramPlaceholders = new object[parameters.Length]; for (int i = 0; i < paramPlaceholders.Length; i++) { DbParameter dbParam = command.CreateParameter(); dbParam.ParameterName = getParameterName(commandBuilder, i); dbParam.Value = parameters[i] ?? DBNull.Value; command.Parameters.Add(dbParam); paramPlaceholders[i] = getParameterPlaceholder(commandBuilder, i); } command.CommandText = String.Format(CultureInfo.InvariantCulture, commandText, paramPlaceholders); return command; } } } 

More ADO.NET extension methods: DbExtensions