Monthly Archives: July 2013

Lamda Expression trong C# 3.0

Sự thay đổi lớn của phiên bản C# từ 2.0 lên 3.0 là anonymous method (giúp bạn có thể tạo được các hàm in-line nhanh gọn không cân phải tao những hàm riêng lẻ không cần thiết). Nay với Lamda Expression, bạn có thể viết chương trình nhanh gọn hơn nữa với tóan tữ lamda (=>) Nó đặc biệt phù hợp với việc tương tác với cơ sở dữ liệu (Database) giúp việc code giờ nhẹ nhàng hơn rất nhiều.

* Đây là cách đề sử dụng Lamda Expression:

Đầu tiên với một mảng số nguyên:

lkNumber = new int[] {9, 1, 6, 3, 5, 7, 2, 1, 0, 4 };

và một hàm để thể hiện số nguyên này:

public void DisplayNum(int i)
{
Func<int, String> SoThanhChuoi = n => n.ToString() + “\r\n”;
txtThongBao.Text += SoThanhChuoi(i);
}

Trong chương trình, có chứa Func một lệnh in-line mới.

1. Xuất dữ liệu:

* Cách sử dụng delegate với mảng số nguyên:

Array.ForEach(lkNumber, delegate(int i)
{
DisplayNum(i);
});

=> Kết quả sẽ hiện lên màn hình là từng số nguyên được xuống dòng (“\r\n”). Đây là cách viết ngắn hơn so với việc dùng vòng foreach rồi mới gọi lệnh nếu các lệnh dài.

* Cách sử dụng lamda expression:

Array.ForEach(lkNumber, i => DisplayNum(i));

=> Code giờ đây chỉ bao gồm 1 dòng duy nhất nhanh chóng và gọn gàn với lamda expression.

2. Sắp xếp trong mảng:

* Cách sử dụng delegate:

Array.Sort(lkNumber, delegate(int x, int y)
{
return x.CompareTo(y);
});

=> Sắp xếp sử dụng với delegate

* Cách sử dụng Lamda Expression:

Array.Sort(lkNumber, (x, y) => x.CompareTo(y));

3. Kiểm tra điều kiện của một mảng:

* Cách sử dụng delegate:

bool b = Array.TrueForAll(lkNumber, delegate(int i){
return i < 10;
});

=> Dùng chương trình

* Cách sử dụng Lamda Expression:

bool a = Array.TrueForAll(lkNumber, i => i < 10);

=> Cách sử dụng với Lamda Expression khiến cho chương trình ngắn và gọn hơn rất nhiều lần.

* Delegate Func<…> trong C# mới:

1. Định nghĩa:

Func là một tính năng mới đi kèm với Lamda Expression trong C#
Đây chính là một dạng delegate mới gọn gàng, linh hoạt và tiện dụng hơn nhiều so với việc viết một function theo đúng mẫu.
Cấu trúc của nó như sau:

Func<T, T, T, …, TResult>

Trong đó T là kiểu biến tham số cần truyền vào
TResult là kiểu dữ liệu được trả vể của Func đó
Việc sử dụng Func cũng vô cùng bình thường như những func khác.

2. Những ví dụ về Func:
* Func lấy độ dài của chuỗi:
Func<String, int> lkLayDoDaiChuoi = x => x.Length;

* Func tính tích của 2 int:
Func<int, int, float> lkMultiple = (x, y) => x *y;
* Func tính tổng của 2 int
Func<int, int, int> lkSum = (x, y) => x + y;

* Func trả về max của một số
Func<int, int, int> lkMax = (x, y) => x > y ? x : y;

* Func kết hơp với LINQ để kiểm tra một phần tử có nằm trong một list hay không:

Func<string, bool> KiemTraTrongArray = n => lkList.Any(x => x.MaSo == n);

* Source Code chương trình demo cho những kiến thức trên:

– Mediafire: http://www.mediafire.com/download/zbk1zulamubnj44/LabLamdaExpression.rar

Advertisements

Thiết kế phẳng trong lập trình IOS

Như các bạn đã biết, IOS 7 đã được chính thức áp dụng thiết kế phẳng (Flat Design )

Tuy nhiên IOS 7 chưa xuất hiện chính thức và nếu chúng ta muốn lập trình với Flat Desgin thì buộc iDeveide phải được cài IOS 7 khá là bất tiện.

Đây là phần bắt chước giao diện thiết kế phẳng dành cho Button. Các bạn cứ sử dụng thoải mái 🙂

 

LKFlatDesign

 

 

Source đang update!! Thông cảm 😀

RollBack

public static void RollBack(this ObjectContext context)
{
IEnumerable<ObjectStateEntry> objectStateentries = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified);

foreach (ObjectStateEntry entry in objectStateentries)
{
if (entry.State == EntityState.Modified)
{
if (entry.CurrentValues != entry.OriginalValues)
{
for (int i = 0; i < entry.OriginalValues.FieldCount; i++)
{
entry.CurrentValues.SetValue(i, entry.OriginalValues[i]);
}
entry.AcceptChanges();
}
}
else
{
if (entry.State == EntityState.Added && entry != null)
{
entry.Delete();
}
else
{
entry.ChangeState(EntityState.Unchanged);
}
}
}
}

Giới hạn số dòng (Row) trong DataGridView

Số lượng dòng (Row) trong DataGridView là không có giới hạn. Tuy nhiên, có những lúc sử dụng DataGridView ta cần giới hạn số dòng được nhập vào trong DataGridView. Lúc đó ta sẽ sử dụng 2 sự kiện (Event) của DatagridView là UserAddedRow và UserDeletedRow để khống chế số lượng dòng của dgv.

Đối với UserAddRows thì chúng ta sẽ xem xét xem số dòng có vượt qua số lượng tối đa mà chúng ta cần hay không?

Đối với UserDeletedRow thì chúng ta sẽ cho phép thêm dòng cho datagridview đó.

Đây là đoạn code dùng để xem xét (checking) số dòng trong datagridview:

public int MaxRows { get; set; }

public LKLimitDataGridView()
{
MaxRows = 5;

InitializeComponent();

lkdgv.UserAddedRow += dgRowLimit_RowCountChanged;
lkdgv.UserDeletedRow += dgRowLimit_RowCountChanged;
}

private void dgRowLimit_RowCountChanged(object sender, EventArgs e)
{
CheckRowCount();
}

private void CheckRowCount()
{

if (dgv_list.Rows.Count == 1)
return;
if (lkdgv.Rows != null && lkdgv.Rows.Count > MaxRows)
{
lkdgv.AllowUserToAddRows = false;
}
else if (!lkdgv.AllowUserToAddRows)
{
lkdgv.AllowUserToAddRows = true;
}
}

=> Sử dụng thuộc tính AllowUserToAddRows để set quyền thêm dòng cho Datagridview:

(Lưu ý: Trường hợp đặc biệt khi số lượng Rows được giới hạn bằng 1 khi đó người sử dụng xóa dòng duy nhất đi sẽ làm cho chương trình bị overflow do xóa đi 1 record thì chương trình set lại dữ liệu. Tuy nhiên, chương trình lại tự động thêm vào record mới để adding new làm thành vòng lặp vô hạn. Cần lưu ý trường hợp này)

Class dynamic ví dụ

Một class có thể sử dụng toàn bộ các thuộc tính và function đều là dynamic:

class VeryDynamicClass
{
/// <summary>
/// Đây là một class có tính cơ động rất cao
/// Từ các thuộc tính private đến các thuộc tính public đều được dynamic
/// Ngay cả function cũng là dynamic
///
/// Tuy nhiên trong thực tế, đối tượng này không có giá trị thực tiễn cho lắm.
/// Do đối tượng được trả về không có gì chắc chắn nên khó lòng có thể sử dụng được
/// </summary>

private static dynamic myDynamicField;

public dynamic DynamicProperty { get; set; }

public dynamic DynamicMethod(dynamic dynamicParam)
{
dynamic dynamicLocalVar = “local variable”;

int lkInt = 79;

if (dynamicParam is int)
{
return dynamicLocalVar;
}
else
{
return lkInt;
}
}
}

+ X

Dynamic programming with C#

* Dynamic Programming: Lập trình với dynamic sẽ khiến số lượng code giảm đi rất nhiều. Về performent thì chương trình có thể chạy chậm hơn một chút so với chương trình được viết bằng tay. Tuy nhiên, chương trình sẽ được viết nhanh hơn rất nhiều so với chương trình được viết bằng tay.

* Những lợi ích:

– Giảm bớt những đoạn code lặp lại (duplicated) như kiểm tra (checking), phân tích cú pháp, ngữ nghĩa

– Rút ngắn mã lệnh (Code) và truy xuất tự động các thuộc tính nằm trong đối tượng.

– Hỗ trợ tốt cho lập trình hướng đối tượng.

 /// <summary>
/// 1. Lấy metadata để lấy được type (Loại) của đối tượng
/// 2. Tạo đối tượng Minivan từ type của nó
/// 3. Lấy thông tin từ function của đối tượng
/// 4. Gọi function và truyền biến vào trong method
///
/// Updated Date: 16/07/2013
/// </summary>
/// <param name=”asm”></param>
static void CreateUsingLateBinding(Assembly asm)
{
try
{
Type miniVan = asm.GetType(“CarLibrary.MiniVan”);
object obj = Activator.CreateInstance(miniVan);
MethodInfo mi = miniVan.GetMethod(“TurboBoost”);
mi.Invoke(obj, null);
}
catch (Exception ex)
{
MessageBox.Show(“Lỗi : ” + ex.Message);
}
}

/// <summary>
/// Sử dụng dynamic trong method làm cho chương trình ngắn hơn nhiều lại đơn giản hơn
/// Chỉ việc tạo một đối tượng từ Activator sau đó sử dụng
/// Ghi chú: Quan trọng nhất là các hàm (method) lúc sử dụng phải chính xác nếu không thì runtime sẽ báo lỗi
/// Compile sẽ không bao giờ báo lỗi với các class thuộc loại Dynamic
/// </summary>
/// <param name=”asm”></param>
static void InvokeMethodWithDynamicKeyword(Assembly asm)
{
try
{
Type miniVan = asm.GetType(“CarLibrary.MiniVan”);
dynamic car = Activator.CreateInstance(miniVan);
car.TuroBoost();
}
catch (Exception ex)
{
MessageBox.Show(“Lỗi : ” + ex.Message);
}
}

// Sử dụng dynamic Keyword với đối số (arg)

/// <summary>
/// Cách sử dụng Refection với đối số (parameter) truyền vào arg là một list của Object
/// </summary>
private static void AddWithReflection()
{
Assembly asm = Assembly.Load(“MathLibrary”);
try
{
Type math = asm.GetType(“MathLibrary.SimpleMath”);
object obj = Activator.CreateInstance(math);
MethodInfo mi = math.GetMethod(“Add”);
object[] arg = { 10, 20 };
MessageBox.Show(“Result is : ” + mi.Invoke(mi, arg));
}
catch (Exception ex)
{
MessageBox.Show(“Lỗi : ” + ex.Message);
}
}

/// <summary>
/// Cách sử dụng Dynamic với đối số vô cùng đơn giản
/// </summary>
private static void AddWithDynamic()
{
Assembly asm = Assembly.Load(“MathLibrary”);
try
{
Type math = asm.GetType(“MathLibrary.SimpleMath”);
dynamic lk = Activator.CreateInstance(math);
MessageBox.Show(“Result is : ” + lk.Add(70, 10));
}
catch (Exception ex)
{
MessageBox.Show(“Lỗi : ” + ex.Message);
}
}

Trong đó lệnh cần để sử dụng dynamic là: public class SimpleMath
public int Add(int x, int y)        {            return x + y;        }

Delegate trong C#

Delegate là một trong những chức năng khá hay trong C#. Nó có thể truyển những lệnh vào và thực thi cùng lúc.

+ Bài viết này cung cấp cách sử dụng sơ đẳng nhất của Delegate trong C# với cách sử dụng đơn giản

+ Có 3 function để truyển vào trong chương trình với cùng một parameter. Sau khi ép vào trong delegate sẽ được thực thi cùng lúc khi delegate được Invoke.

namespace DelegateX
{
    public partial class MainWindow : Window
    {
        public delegate void Convertation(String X);
        public MainWindow()
        {
            InitializeComponent();

            var delegateX = new Convertation(SayHello);
            delegateX += SaySomething;
            delegateX += SayGoodbye;

            delegateX.Invoke(“eTamDuc”);
        }

        public void SayHello(String message)
        {
            MessageBox.Show(message + ” hello \r\n”);
        }

        public void SaySomething(String message)
        {
            MessageBox.Show(message + ” saysomething \r\n”);
        }

        public void SayGoodbye(String message)
        {
            MessageBox.Show(message + ” say goodbye \r\n”);
        }
    }
}