LINQ系列:C#中與LINQ相關特性


1. 匿名類型

  通過關鍵字var定義匿名類型,編譯器將根據運算符右側表達式的值來發出一個強類型。

  使用匿名類型時要遵守的一些基本規則:

  ◊ 匿名類型必須有一個初始化值,而且這個值不能是空值(null),因為類型是根據初始化器推斷出來的;

  ◊ 匿名類型可以用於簡單類型,也可以用於復雜類型。用於定義簡單類型時,其價值不大。復合匿名類型需要有成員聲明;

  ◊ 匿名類型不能用於類的字段;

  ◊ 匿名類型可以在for循環中用作初始化器;

  ◊ 可以使用new關鍵字;數組的初始化器必須使用new關鍵字;

  ◊ 匿名類型可以用於數組;

  ◊ 所有匿名類型都派生自Object類型;

var title = "LINQ to Object";

1.1 復合匿名類型

var product = new { Title = "LINQ to Object", UnitPrice = 10m };

1.2 在for/foreach語句中使用匿名類型

var fibonacci = new int[] { 1, 1, 2, 3, 5, 8, 13, 21 };
for (var i = 0; i < fibonacci.Length; i++)
{
    Console.WriteLine(fibonacci[i]);
}
var fibonacci = new int[] { 1, 1, 2, 3, 5, 8, 13, 21 };
foreach (var number in from f in fibonacci where f > 5 select f)
{
    Console.WriteLine(number);
}

1.3 匿名類型與using

using( var connection = new SqlConnection(connectionString))
{
    connection.Open();
    // ......
}

2. 數組初始化器

  使用關鍵字new初始化數組。

var fibonacci = new int[]{ 1, 1, 2, 3, 5, 8, 13, 21 };

3. 匿名泛型方法

Func<long, long> Factorial = delegate(long n)
{
    if (n == 1)
    {
        return 1;
    }

    long result = 1;
    for (int i = 2; i <= n; i++)
    {
        result *= i;
    }
    return result;
};

Console.WriteLine(Factorial(6));
// using System.Diagnostics;
Func<long, long> Factorial = delegate(long n)
{
    return n > 1 ? n * (long)(new StackTrace()
        .GetFrame(0)
        .GetMethod()
        .Invoke(null, new object[] { n - 1 }))
        : n;
};

Console.WriteLine(Factorial(6));

4. 自動實現屬性

public string ProductName { get; set; }

  設置只讀屬性:

public string ProductName { get; private set; }

5.對象初始化器和集合初始化器

  對象初始化器:在不調用類的構造函數以聲明性方式創建一個新的對象,並設置該對象的各個屬性的值。

Product product = new Product
{
    ProductID = 1,
    ProductName = "LINQ to Object",
    UnitPrice = 10m
};

  集合初始化器用來初始化一個集合。

List<int> num = new List<int> { 0, 1, 2, 6, 7, 8, 9

  結合對象初始化器使用:

List<Product> products = new List<Product> { 
    new Product { ProductID = 1, ProductName = "LINQ to Object", UnitPrice = 10m },
    new Product { ProductID = 2, ProductName = "LINQ to ADO.NET", UnitPrice = 20m }
};

6.  Lambda表達式

  Lambda表達式是一個匿名函數,它可以包含表達式和語句,並且可用於創建委托或表達式目錄樹類型。

  Lambda表達式的基本形式:

(input parameters) => expression

  其中,input parameters表示輸入參數,expression表示表達式。輸入參數的數量可以為空,1個或多個。

  當輸入參數為空是,Lambda表達式左邊的()不能省略。

() => Console.WriteLine("Empty");
Func<DateTime> getDateTime = () => DateTime.Now;

  當Lambda表達式的輸入參數的數量為1時,輸入參數的()可以省略。

x => x * x;

  當Lambda表達式的輸入參數的數量大於1時,輸入參數的()是必須的,且參數之間使用逗號分隔。

(x, y) => x * y;

  Lambda的delegate形式轉換:

delegate(int x) { return x * x; };

7. 查詢表達式

var products = from p in ctx.Products
               where p.UnitPrice > 10m
               select p;

8. 擴展方法

  擴展方法是C#中一個重要的特性,其對於LINQ的實現起着關鍵的作用。擴展方法在使用上類似於靜態方法,但在本質上其是實例方法。

  擴展方法在參數前加上this關鍵字,參數的類似表示這個擴展方法要對這個類型進行擴展。

public static class Extensions
{
    public static bool IsValidEmailAddress(this string value)
    {
        Regex regex = new Regex(@"^[\w\.]+@([\w]+\.)+[\w]{2,4}$"return regex.IsMatch(value);
    }
}

 

關聯隨筆:C# LINQ需求實現演化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM