Содержание
Расширяемые методы
делегаты и события
LINQ to Objects
LINQ to XML


  • Расширяющие методы
Расширяющие методы позволяют добавить методы в классы без использования наследования. Например, добавим метод isOdd (нечетное ли число) к элементарному типу int.
static class IntExtensions
{
    // ключевое слово this указывает, что первый аргумент - объект расширяемого класса
    public static bool isOdd(this int x)
    {
        return (x % 2) == 1;
    }
}
Теперь можно вызывать метод isOdd для переменных типа int
int x = 10;
x.isOdd(); // вернет false
x = 13;
x.isOdd(); // вернет true
Вместо int в методе isOdd можно указывать и любой другой тип/класс.
Расширяющие методы активно используются в LINQ

  • делегаты и события

  • LINQ to Objects
Пусть стоит задача - отфильтровать из имеющегося массива строк те строки, длина которых меньше трех. Исходный массив описывается, например, так:
string[] ss = { "abc", "ab", "cb", "d" };
Первое решение совместимо со старыми версиями .Net:
ArrayList ss_ = new ArrayList();
for (int i = 0; i < ss.Length; ++i)
{
    if (ss[i].Length < 3)
    {
        ss_.Add(ss[i]);
    }
}
string[] ss1 = (string[])ss_.ToArray(typeof(string));
// выводим на экран результаты
foreach (var s in ss1)
{
    Console.Out.WriteLine(s);
}
А теперь то же самое, но с использованием LINQ и его расширяющих методов
var ss2 = ss.Where(p => p.Length < 3).Select(p => p);
// выводим на экран результаты
foreach(var s in ss2) {
    Console.Out.WriteLine(s);
}
И с помощью специального синтаксиса LINQ:
var ss3 = from p in ss where p.Length < 3 select p;
// выводим на экран результаты
foreach (var s in ss3)
{
    Console.Out.WriteLine(s);
}
Как мы видим с помощью LINQ решение получилось более компактным и значительно более читаемым.
Особенность использования LINQ в том, что вычисление выражения-запроса происходит лениво/отложено. Т.е. запрос не будет выполнен до тех пор, пока к переменной, содержащей результаты, не будет явного обращения (как, например в цикле foreach). Например, в приведенном ниже примере переменная ss1 хранит не результат запроса, а сам запрос:
string[] ss = { "abc", "ab", "cb", "d" };
var ss1 = from p in ss where p.Length < 3 select p;
foreach (var s in ss1)
    Console.Out.WriteLine(s);
На экране мы соответственно увидим
ab
cb
d
Однако, если внести изменения в массив ss, то итерация по запросу ss1 даст нам новые результаты:
ss[1] = "ZZ";
foreach (var s in ss1)
    Console.Out.WriteLine(s);
И на экране мы соответственно увидим
ZZ
cb
d

  • LINQ to XML

Last edited Mar 15, 2012 at 5:56 AM by basph, version 11

Comments

No comments yet.