What is DynamicSugar.Net?
The Dynamic Sugar Library provides methods and classes inspired by the dynamic languages Python and JavaScript to write shorter and more readable source code in C# 4.0.
License:
- You may use DynamicSugar.Net under the terms of the MIT License.
Blog Posts:
Screen Casts:
Platforms Casts:
- Microsoft Windows and Windows Phone, .NET v 4.x
- Xamarin iOS and Android
List<T> - List literal
static void DoSomething(List<int> l){ } static void main(string [] args) { DoSomething(new List<int>() { 1, 2, 3 }); // Regular C# DoSomething(DS.List( 1, 2, 3 )); // Dynamic Sugar Syntax }
Check if an element is in a List<T>. For custom class you must override the method Equals().
var i = 3; var Values = new List<int>() { 1, 2, 3 }; // Regular C# if(Values.Contains(i)) Console.WriteLine("in the list"); if(i.In(1,2,3)) // Dynamic Sugar Syntax Console.WriteLine("in the list");
Dictionary - Dictionary literal
void MyFunction(IDictionary<string, object> d){ } void Sample3(){ MyFunction(new Dictionary<string,object>() { // Regular C# { "Debug" , true }, { "Continent", "North America" } }); // Dynamic Sugar Syntax MyFunction( DS.Dictionary( new { Debug=true, Continent="North America" } ) ); // In() method var stones = DS.Dictionary<int>( new { Mick=1943, Keith=1943, Brian=1942, Bill=1936, Charlie=1941 } ); if("Mick".In(stones)) { } }
Define the type of the value
void MyFunction(IDictionary<string, bool> d){ } void Sample4(){ MyFunction(new Dictionary<string, bool>() { // Regular C# { "Debug" , true }, { "Verbose", false } }); // Dynamic Sugar Syntax MyFunction( DS.Dictionary<bool>( new { Debug=true, Verbose=false } ) ); }
Formatting Strings - Extension Methods for the class String
void Sample5(){ var firstName = "Fred"; var age = 45; var s1 = String.Format("firstName:{0}, age:{1}", firstName, age ); // Regular C# // Dynamic Sugar Syntax. Is that beautiful? var s2 = "firstName:{firstName}, age:{age}".Format( new { firstName , age } ); }
Formatting custom classes. You can add the Format() method as an extension method as well.
class Person { public string Name { set; get; } public int Age { set; get; } public string Format(string format, params object[] args) { return DynamicSugar.ExtendedFormat.Format(this, format, args); } } void Sample6(){ var p = new Person() { Name = "Fred", Age = 45 }; Console.WriteLine( String.Format( "Name={0}, Age={1:000}", p.Name, p.Age ) ); // Regular C# Console.WriteLine( p.Format( "Name={Name}, Age={Age:000}" ) ); // Dynamic Sugar Syntax }
Formatting List<T> and Dictionary
public static void Sample6_2(){ var v1 = DS.List(1, 2, 3).Format(); // 1, 2, 3 var v2 = DS.List(1, 2, 3).Format( @"""{0}""", "; " ); // "1"; "2"; "3" var v3 = DS.List("a", "b", "c").Format(); // "a", "b", "c" var v4 = DS.List("a", "b", "c").Format( @"({0})", "; " ); // ("a"); ("b"); ("c") var beatles = DS.Dictionary<int>( new { Paul=1942, John=1940, Richard=1940, George=1943 } ); var v5 = beatles.Format(); // { Paul:1942, John:1940, Richard:1940, George:1943 } var v6 = beatles.Format(@"""{0}""=""{1}""", "; "); // { "Paul"="1942"; "John"="1940"; "Richard"="1940"; "George"="1943" } }
Function returning multiple values
Almost like in JavaScript. Anonymous Types are internal classes and this is why we need to call DS.Values().// Regular C# static bool ComputeValues(int value, out double amount, out string message){ amount = 2.0 * value; message = "Hello"; return true; } // Dynamic Sugar Syntax static dynamic ComputeValues(int value){ return DS.Values( new { returnValue = true, amount = 2.0 * value, message = "Hello" } ); } void Sample7(){ // Regular C# string message; double amount; var returnStatus = ComputeValues( 2, out amount, out message ); Console.WriteLine( "returnStatus:{0}, amount:{1}, message:{2}", returnStatus, amount, message ); // Dynamic Sugar Syntax var r = ComputeValues( 2 ); Console.WriteLine("returnStatus:{0}, amount:{1}, message:{2}", r.returnValue, r.amount, r.message ); }
Range
void Sample8(){ for(int i=0; i<10; i++) // Regular C# Console.WriteLine(i); foreach(var i in DS.Range(10)) // Dynamic Sugar Syntax Console.WriteLine(i); }
Extension methods for List<T>
public static void Sample9(){ var v1 = DS.List(1, 2, 3).Add( DS.List( 4, 5, 6 ) ); var v2 = DS.List(1, 2, 3).Clone(); var v3 = DS.List(1, 2, 3).Filter( e => e % 2 == 0 ); // Same as FindAll() for IEnumerable<> var v5 = DS.List(1, 2, 3).Identical( DS.List( 1, 2, 3 ) ); var v6 = DS.List(1, 2, 3).Include( DS.List( 2, 3 ) ); var v7 = DS.List(1, 2, 3).Include( 2, 3 ); var v8 = DS.List(1, 2, 3).Intersect( DS.List( 3, 4, 5) ); // Same as Intersect() for IEnumerable<> var v9 = DS.List(1, 2, 3).IsNullOrEmpty(); var v10 = DS.List(1, 2, 3).Map( e => e * 2 ); // Same as Select() for IEnumerable<> var v11 = DS.List(1, 2, 3).Merge( DS.List(3, 4, 5) ); var v12 = DS.List(1, 2, 3).Reject( e => e % 2 == 0 ); var v13 = DS.List(1, 2, 3).Substract( DS.List( 3, 4, 5) ); DS.List(1, 2, 3).ToFile(@"C:\\MyFile.txt"); var v15 = DS.ListHelper.FromFile<int>(@"C:\\MyFile.txt"); var v16 = DS.List(1, 2, 3).Without( DS.List(2, 3) ); var v17 = DS.List(1, 2, 3).Without( 2, 3 ); }
More extension methods for the List<T>
void Sample10(){ var v1 = DS.List(1, 2, 3); while(!v1.IsEmpty()) { Console.WriteLine("{0} - {1}", v1.First(), v1.Last()); v1 = v1.Rest(); } }
String extension methods - The Slice function
public void Sample11() { var s = "ABCD"; Assert.AreEqual("ABCD" , s.Slice(0 )); Assert.AreEqual("BCD" , s.Slice(1 )); Assert.AreEqual("AB" , s.Slice(0 , 2)); Assert.AreEqual("BC" , s.Slice(1 , 2)); Assert.AreEqual("DCBA" , s.Slice(-1 )); Assert.AreEqual("CB" , s.Slice(-2, 2)); }
Other extension methods
public static void Sample12() { Assert.AreEqual("DCBA", "ABCD".Reverse()); Assert.AreEqual("1;2;3", ";".Join(DS.List(1, 2, 3))); string s1 = null; Assert.AreEqual("default", s1.IfNullOrEmpty("default")); if(s1.IsNullOrEmpty()){ } Assert.AreEqual("Lastname", "lastname".Capitalize()); Assert.AreEqual("1,2,3,", ",1,2,3,".RemoveFirstChar()); Assert.AreEqual("1,2,3,", ",1,2,3,".RemoveFirstChar()); Assert.AreEqual(",1,2,3", ",1,2,3,".RemoveLastChar()); Assert.AreEqual(",1,2,3", ",1,2,3,".RemoveLastChar()); Assert.AreEqual("1,2,3", ",1,2,3,".RemoveLastChar().RemoveFirstChar()); }
Extension methods for Dictionary
public static void Sample13() { var beatles = DS.Dictionary<int>( new { Paul=1942, John=1940, Richard=1940, George=1943 } ); var other = beatles.Get("Pete", 1941); // Support a default value for non existing key var younger1 = beatles.Max(); // Return the entry with the greatest value var younger2 = beatles.Max(DS.List("Paul", "John", "Richard")); var older1 = beatles.Min(); // Return the entry with the smallest value var older2 = beatles.Min(DS.List("Paul", "Richard", "George")); var newMusicians = beatles.Clone(); // Add or remove entries to a dictionary var stones = DS.Dictionary<int>( new { Mick=1943, Keith=1943, Brian=1942, Bill=1936, Charlie=1941 } ); var allTogether = beatles.Add(stones); var noStones = allTogether.Remove(stones); // Determine if a dictionary contains a key, a dictionary or literal dictionary var b1 = beatles.Include(beatles); var b2 = beatles.Include("Paul"); var b3 = beatles.Include( new { Paul=1942, John=1940 } ); // Process string template with the value of a dictionary var InstallVar = DS.Dictionary( new { SERVER="foo.bar.local", USER=@"bat\\jshmoe", PASSWORD="abcd" } ); var batchCode = InstallVar.PreProcess(@"msiexec.exe /i product.msi SERVER={SERVER} USER={USER} PASSWORD={PASSWORD}"); }
No comments:
Post a Comment