Converting a DataTable to List

Converting a DataTable to List

 

 

public static List<T> ToList<T>(this DataTable table) where T : new()
{
      List<PropertyInfo> properties = typeof(T).GetProperties().ToList();
      List<T> result = new List<T>();
      foreach (var row in table.Rows)
      {
        var item = CreateItemFromRow<T>((DataRow)row, properties);
        result.Add(item);
      }
      return result;
    }
    private static T CreateItemFromRow<T>(DataRow row, List<PropertyInfo> properties) where T : new()
    {
      T item = new T();
      foreach (var property in properties)
      {
        if (row.Table.Columns.Contains(property.Name))
        {
          if (row[property.Name] != DBNull.Value)
            property.SetValue(item, row[property.Name], null);
        }
      }
      return item;
}

 

Interface - Giao diên trong C#

 

1. Định nghĩa interface (giao diện) 

Giao diện là ràng buộc, giao ước đảm bảo cho các lớp hay các cấu trúc sẽ thực hiện một điều gì đó. Khi một lớp thực thi một giao diện, thì lớp này báo cho các thành phần client biết rằng lớp này có hỗ trợ các phương thức, thuộc tính, sự kiện và các chỉ mục khai báo trong giao diện. 

Một giao diện thì giống như một lớp chỉ chứa các phương thức trừu tượng. Một lớp trừu tượng được dùng làm lớp cơ sở cho một họ các lớp dẫn xuất từ nó. Trong khi giao diện là sự trộn lẫn với các cây kế thừa khác.

Tuy nhiên bạn phải hiểu là giao diện không phải là lớp.

Sau đây sẽ giới thiệu với bạn cách định nghĩa và thực thi một giao diện

Cú pháp để định nghĩa một giao diện như sau:

 

[thuộc tính] [phạm vi truy cập] interface <tên giao diện> [: danh sách cơ sở]
 {

  /* phần thân giao diện */

 }

 

Phần thuộc tính chúng ta chưa đề cập tới các bạn hãy lưu ý đến phần phạm vi truy cập bao gồm public, private, protected, internal, và protected internal đã được nói đến. Theo sau từ khóa interface là tên của giao diện. Thông thường tên của giao diện được bắt đầu với từ I hoa (điều này không bắt buộc nhưng việc đặt tên như vậy rất rõ ràng và dễ hiểu, tránh nhầm lẫn với các thành phần khác).

Danh sách cơ sở là danh sách các giao diện mà giao diện này mở rộng, phần này sẽ được trình bày trong phần thực thi nhiều giao diện. Phần thân của giao diện chính là phần thực thi giao diện.

2. Thực thi giao diện

Giả sử chúng ta muốn tạo một giao diện nhằm mô tả những phương thức và thuộc tính của một lớp cần thiết để lưu trữ và truy cập từ một cơ sở dữ liệu hay các thành phần lưu trữ dữ liệu khác như là một tập tin. Chúng ta quyết định gọi giao diện này là IStorage. Trong giao diện này chúng ta xác nhận hai phương thức: Read() và Write(), khai báo này sẽ được xuất hiện trong phần thân của giao diện như sau: 

 

interface IStorable
{
    void Read();
    void Write(object);
}

 

Mục đích của một giao diện là để định nghĩa những khả năng mà chúng ta muốn có trong một lớp. Ví dụ, chúng ta có thể tạo một lớp tên là Document, lớp này lưu trữ các dữ liệu trong cơ sở dữ liệu, do đó chúng ta quyết định lớp này này thực thi giao diện IStorable. Để làm được điều này, chúng ta sử dụng cú pháp giống như việc tạo một lớp mới Document được thừa kế từ IStorable bằng dùng dấu hai chấm (:) và theo sau là tên giao diện:

 

public class Document : IStorable
{
    public void Read()
    {
        // ...
    }
    public void Write()
    {
        //...
    }
}

 

Dưới đây là code minh họa việc thực thi giao diện:

 

using System;

// khai báo giao diện
interface IStorable
{
    // giao diện không khai báo bổ sung truy cập
    // phương thức là public và không thực thi (chỉ khai báo)
    void Read();
    void Write(object obj);
    int Status
    {
        get;
        set;
    }
}

// tạo một lớp thực thi giao diện IStorable
public class Document : IStorable
{
    public Document(string s)
    {
        Console.WriteLine("Creating document with: {0}", s);
    }

    // thực thi phương thức Read()
    public void Read()
    {
        Console.WriteLine("Implement the Read Method for IStorable");
    }

    // thực thi phương thức Write
    public void Write(object o)
    {
        Console.WriteLine("Impleting the Write Method for IStorable");
    }

    // thực thi thuộc tính
    public int Status
    {
        get
        {
            return status;
        }
        set
        {
            status = value;
        }
    }

    // khai báo trường dữ liệu status
    private int status = 0;
}

public class Tester
{
    static void Main()
    {
        // khởi tạo đối tượng Document
        Document doc = new Document("Test Document");
        doc.Status = -1;
        doc.Read();
        Console.WriteLine("Document Status: {0}", doc.Status);

        // khởi gán một giao diện
        IStorable isDoc = (IStorable)doc;
        isDoc.Status = 0;
        isDoc.Read();

        Console.WriteLine("IStorable Status: {0}", isDoc.Status);
        Console.ReadLine();
    }
}

 

3. Thực thi nhiều giao diện

Trong ngôn ngữ C# cho phép chúng ta thực thi nhiều hơn một giao diện. Ví dụ, nếu lớp Document có thể được lưu trữ và dữ liệu cũng được nén. Chúng ta có thể chọn thực thi cả hai giao diện IStorable và ICompressible. Như vậy chúng ta phải thay đổi phần khai báo trong danh sách cơ sở để chỉ ra rằng cả hai giao diện điều được thực thi, sử dụng dấu phẩy (,) để phân cách giữa hai giao diện:

 

public class Document : IStorable, ICompressible

 

Khi đó lớp Document phải thực hiện đầy đủ các method được khai báo trong ICompressible.

4. Mở rộng giao diện

C# cung cấp chức năng cho chúng ta mở rộng một giao diện đã có bằng cách thêm các phương thức và các thành viên hay bổ sung cách làm việc cho các thành viên. Ví dụ, chúng ta có thể mở rộng giao diện ICompressible với một giao diện mới là ILoggedCompressible. Giao diện mới này mở rộng giao diện cũ bằng cách thêm phương thức ghi log các dữ liệu đã lưu:

 

interface ILoggedCompressible : ICompressible
{
    void LogSavedBytes();
}

 

5. Kết hợp giao diện

Một cách tương tự, chúng ta có thể tạo giao diện mới bằng cách kết hợp các giao diện cũ và ta có thể thêm các phương thức hay các thuộc tính cho giao diện mới. Ví dụ, chúng ta quyết định tạo một giao diện IStorableCompressible. Giao diện mới này sẽ kết hợp những phương thức của cả hai giao diện và cũng thêm vào một phương thức mới để lưu trữ kích thước nguyên thuỷ của các dữ liệu trước khi nén:

 

interface IStorableCompressible : IStoreable, ILoggedCompressible
{
    void LogOriginalSize();
}

 

Các bạn đã được làm quen với một khái niệm nữa trong C# đó là giao diện (interface). Cách định nghĩa và thực thi một interface, các thực thi nhiều interface, mở rộng và kết hợp các interface.

Nguồn: http://vubka.blogspot.com/2010/04/interface.html

 

Phân trang bằng LINQ trong ASP.NET

 

public List<UserInfo> GetByPageLinq(int pageSize, int pageNum, out int totalRowCount)
{
    List<UserInfo> temp = GetAll();
    var query = from c in temp
                orderby c.UserID ascending
                select c;
    totalRowCount = temp.Count;
    var list = query.Skip(pageSize * (pageNum - 1)).Take(pageSize).ToList();
    return list;
}

 

Singleton "plus" - Một số cải tiến đối với mẫu Singleton

Singleton là một trong những mẫu thiết kế (Design Pattern) dễ cài đặt nhưng cũng rất hiệu quả trong thiết kế phần mềm. Ở đây mình không nhắc lại về mẫu này, chỉ xin trình bày một số “cải tiến” nhỏ đối với Singleton mà mình đã sử dụng trong thực tế.

1. Thread-safe Singleton objects

Mục đích: Mẫu Singleton chuẩn có thể sử dụng cho các lớp chỉ có duy nhất 1 instance trong chương trình. Tuy nhiên trong các ứng dụng có nhiều thread, mà các thread này đều phải truy xuất chung đến một đối tượng Singleton thì sẽ nảy sinh nguy cơ xung đột. Do đó cần có cơ chế đảm bảo việc truy xuất đối tượng Singleton sao cho không xảy ra hiện tượng này.

Cài đặt:

public class TSSingleton
{      
    private static object SyncRoot = new object();    
    private static TSSingleton m_Instance;    
    protected TSSingleton()
    { 
        // Initialize code goes here…       
    }

    public static TSSingleton Instance
    {                
        get
        {         
            lock (SyncRoot)
            {           
                if (m_Instance == null)
                    m_Instance = new TSSingleton();    
            }
            return m_Instance;    
        }         
    }      
}

Cài đặt khá đơn giản. Một đối tượng SyncRoot được dùng để đảm bảo tại một thời điểm, chỉ có đúng 1 thread truy xuất đối tượng TSSingleton. Kĩ thuật này hiệu quả khi đối tượng Singleton là một phần tử trong giao diện, và có vài thread đang chạy nền có như cầu truy xuất đến nó.

2. “Multi”-ton

Ứng dụng thực tế: Các chương trình chat như Yahoo Messenger, Microsoft Live Messenger v.v… có thể quản lý nhiều cửa sổ chat cùng một lúc, nhưng mỗi cửa sổ là duy nhất cho một nick. Giả sử bạn đang chat với nick A, thì chỉ duy nhất 1 cửa sổ chat được tạo ra, ứng với nick chat này. Như vậy nảy sinh yêu cầu có một tập các đối tượng Singleton.

using System.Collections.Generic;

public class Multiton
{    
    private static Dictionary<string, Multiton> m_arrInstances = newDictionary<string, Multiton>();  
    private readonly string m_sID;
    protected Multiton(string sID)
    {
        m_sID = sID;
        // Initialize code goes here…
    }

    public static GetInstance(string ID)
    {
        if(!m_arrInstances.ContainsKey(ID))
            m_arrInstances[ID] = new Multiton(ID);  
        return m_arrInstances[ID];
    }      
}

Trong destructor của lớp, ta cần thêm vào câu lệnh:

m_arrInstances.Remove(m_sID);

để loại đối tượng này khỏi danh sách.

CHỉ là những cải tiến nho nhỏ, mong nhận được ý kiến đóng góp của các bạn.

Visual Studio 2008 có gì mới?

Visual Studio 2008 là một phiên bản của Visual Studio cùng với .Net Framework 3.5 đã được MSDN giới thiệu vào 19.11.2007. Bài viết này sẽ giới thiệu với bạn những thay đổi nổi bật của Visual Studio 2008Visual Studio 2008 hướng tới sự phát triển .Net Framework phiên bản 2.0 , 3.0 và 3.5. Visual Studio 2008 có rất nhiều điểm đặc biệt hơn Visual Studio 2005. Visual Studio 2008 đưa ra một tính năng đặc biệt là XAML trình thiết kế căn bản , Linq to Sql (dùng để mô tả các kiểu ánh xạ và sự đóng gọi của đối tượng cho dữ liệu của SQL server), Trình gỡ lỗi XSLT , hỗ trợ soạn thảo và gỡ lỗi JavaScript. Dưới đây là danh sách một số đặc điểm khác biệt đặc trưng của Visual Studio 2008


  • Hỗ trỡ đa tiêu chí.
  • Soạn thảo Javascript
  • Gỡ lỗi Javascript
  • Cai tiến việc viết code
  • Hỗ trợ lồng các trang Master page
  • Trình thiết kế web và cải thiện trong CSS
  • Chia cửa sổ soạn thảo thành nhiều phần hơn với các tính năng khác nhau có thể nhìn nhiều phần chia theo chiều dọc.
  • Tăng sự hộ trợ cho ASP.NET AJAX Extensions
  • Trình thiết kể LINQ to SQL
  • Tăng hỗ trợ XML
  • Hỗ trợ Silverlight
  • Hỗ trợ WPF
  • Hỗ trợ cho trình gỡ lỗi .Net Framework 3.5 các lớp thư viện.

Các bạn có thể tìm hiểu chi tiết hơn về Visual Studio 2008 tại các nguồn sau:

Video:


Blogs/WhitePapers