PDA

View Full Version : C# 3 امکانات و ساختار های جدید آن همینطور visual studio 2008



rezayat
سه شنبه 06 فروردین 1387, 14:11 عصر
من داشتم در مورد C#3 تحقیقاتی انجام میدادم و چیزای جدیدی پیدا کردم که توی این تاپیک سعی دارم با کمک دوستان این موضوع ها را جمع و جور کنیم . البته یه گزری به C# 2 هم داریم که موضوع‌های مهم اون را که در C#3 هم مهم تر شده مورد بررسی قرار می‌دهم.
لیست اولیه‌ای که در نظر دارم به صورت زیر هست البته و صد البته دوستان باید لیست را کاملتر کنند. نتیجه‌‌ای که از این تابپیک بدست خواهد آمد یک مرجع برای برنامه نویسان حرفه ای خواهد بود انشاالله.:لبخندساده:
1 . generics
2. Anonymous Methods
3.Enumerators and Yield
4.Local Type Inference
5.Lambda Expressions
6.Extension Methods
7.Object Initialization Expressions
8.Anonymous Types
10.LINQ

rezayat
سه شنبه 06 فروردین 1387, 14:17 عصر
در ابتدا از generic ها شروع می‌کینم که این در C# 2 بود . اما در C# 3 بسیار مهم شدند و تقریبا می‌شه گفت حتی کد نویس های ساده نیز دیگر باید این موضوع را کاملا مسلط باشند.
نظرات خودتون را برای تکمیل این فایل بزارید تا یک منبع خوبی در این زمینه داشته باشیم.
امید وارم خوب باشه.

sinpin
سه شنبه 06 فروردین 1387, 15:58 عصر
البته و صد البته دوستان باید لیست را کاملتر کنند.
کلا کار بسیار خوبی رو آغاز کردید بشرط آنکه ادامه دار باشه...


در ابتدا از generic ها شروع می‌کینم که این در C# 2 بود . اما در C# 3 بسیار مهم شدند و تقریبا می‌شه گفت حتی کد نویس های ساده نیز دیگر باید این موضوع را کاملا مسلط باشند.
البته ژنریک ها از همون اول مهم بودند و ربطی به دات نت فریمورک 3.0 به بعد ندارند.

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _


در تاپیک نکات، ایده ها و ترفندهای کوچک برنامه نویسی در #C (http://barnamenevis.org/forum/showthread.php?t=95001) برخی از موارد لیست شما بررسی شده اند :


http://barnamenevis.org/forum/images/statusicon/forum_new.gif مباحث مختص دات نت فریمورک 3.0 و 3.5 :

http://barnamenevis.org/forum/images/statusicon/thread_new.gif نوآوری ها :

http://www.barnamenevis.org/forum/images/icons/icon1.gifمباحث اولیه :

تعریف یک متغیر بدوت تعیین کردن نوع آن در دات نت فریمورک 3.0 به بعد (http://barnamenevis.org/forum/showpost.php?p=470809&postcount=74)
Initilize کردن کالکشنها در دات نت 3.0 به بالا (http://barnamenevis.org/forum/showpost.php?p=470917&postcount=76)
متودهای گسترش (Extension Methods) (http://barnamenevis.org/forum/showpost.php?p=470951&postcount=77)
پراپرتی های اتوماتیک (Automatic Properties) در دات نت 3.0 (http://barnamenevis.org/forum/showpost.php?p=470792&postcount=72)
عدم نیاز به نوشتن انواع توابع سازنده (ctor) در دات نت فریمورک 3.0 به بعد (http://barnamenevis.org/forum/showpost.php?p=470798&postcount=73)LINQ http://www.barnamenevis.org/forum/images/icons/icon1.gif
شروع آشنایی با LINQ بصورت ساده (http://barnamenevis.org/forum/showpost.php?p=470827&postcount=75)WPFhttp://www.barnamenevis.org/forum/images/icons/icon1.gif :



http://www.barnamenevis.org/forum/images/icons/icon3.gif (http://barnamenevis.org/forum/showpost.php?p=471347&postcount=87)(Windows Presentation Foundation (WPF چیست ؟ (http://barnamenevis.org/forum/showpost.php?p=471347&postcount=87)http://barnamenevis.org/forum/images/statusicon/thread_new.gif سایر مباحث :
بدست آوردن لیست تمامی ناحیه های زمانی (Time Zone) (http://barnamenevis.org/forum/showpost.php?p=471161&postcount=83)
کار کردن با کلاس TimeZoneInfo (http://barnamenevis.org/forum/showpost.php?p=471160&postcount=82)

rezayat
پنج شنبه 08 فروردین 1387, 13:09 عصر
این سه تای دیگه را باید بگم که در دات نت 2 هم بودند اما با توجه به این که کمی برای کار با دیگر مباحث اولیه نیاز به آن ها و جود داشت گفته شد البته کامل نبوده و در حد یادآوری و اینکه دوستان اگه کمبودی در این رابطه می‌بینند بگن تا اون ها را کامل‌تر کنم البته لپ مطلب گفته شده.
delegate ها رو که همه میشناسن
anonymous هم در دات نت 2 بود و حالا در کدهای C#3 شما شما خیلی این مسئله را می‌بینید.
Enumerators and Yield که دیگه برای کار با دیتا و حتی غیر دیتا مهم هست .و اون هم دات نت 2 بوده اما مهمتر شده مخصوصا در LINQ
امید وارم خوشتون امداه باشه و انشا الله ادامه داره شما هم به این لیست اضافه کنید.

rezayat
پنج شنبه 08 فروردین 1387, 13:28 عصر
در مورد .Local Type Inference (http://barnamenevis.org/forum/showpost.php?p=470809&postcount=74) متن شما را دیدم خوب بود اما نکات مهمی گفته نشده بود از جمله این که این متغییر ها به صورت local کار می کنند و قابل ارجا نیستند یه چندتا چیز دیگه هم هست که باید کمی روش بحث کنیم .
در مورد WPF فکر می کنم که باید در لیست اضافه شه . همین طور زبان XAML .
یه تکنولوژی جدید هم در این زمینه دیدم که معروف به Silverlight هست که هیچ اطلاعاتی به جز این که جایگزینی به جای فلش از طرف ماکروسافت هست ندارم دوستان اگر می‌دونن یه تاپیک براش راه بندازیم.
extention ها را خوبه اما بازم باید بیشتر در این مورد بحث کرد .
مقدار دهی و گیری به صورت اتوماتیک در دات نت 3 را من اصلا نمی‌دونستم و جالب بود.
یه چیزی که خیلی برای من جالب بود این بود که دات نت 3 (منظورم همون C# 3.5 ) را گزینه‌ای مناسب برای کار با هوش مصنوعی معرفی کرند.
خوشحال می‌شم کسی مثل شما در کامل کردن این تاپیک کمک کنه .:تشویق::لبخندساده:

rezayat
پنج شنبه 08 فروردین 1387, 13:32 عصر
راستی چیزی که یادم رفت در مورد LINQ است که این مبحث خیلی جای کار داره و شاید یه تاپیک بطلبه اما فعلا به صورت تیکه تیکه و ابتدایی نه حرفه‌ای دارم یه چیزهایی حاضر می‌کنم.

rezayat
پنج شنبه 08 فروردین 1387, 13:43 عصر
راستی چیزی که یادم رفت در مورد LINQ است که این مبحث خیلی جای کار داره و شاید یه تاپیک بطلبه اما فعلا به صورت تیکه تیکه و ابتدایی نه حرفه‌ای دارم یه چیزهایی حاضر می‌کنم. البته بگم که یه تاپیک هم در این مورد دیدم که هنوز به حایی نرسیده امیدوارم که دوباره به کار بیافته.

rezayat
پنج شنبه 08 فروردین 1387, 19:40 عصر
خوب دیگه نیازی به نوشتن نبود و دوست عزیز ما قبلا کامل تر از من چیزهایی در این دو مورد تهیه کردند که من هم اون‌ها رو به صورت PDF ایجاد کردم و گذاشتم برای دوستان.
لینک اصلی http://barnamenevis.org/forum/showthread.php?t=99450
توی تاپیک ایشون نمونه کد هم وجود داره.:تشویق:

rezayat
شنبه 10 فروردین 1387, 11:19 صبح
خوب این چند وقت بدجوری مهمون و مهمون بازی بود بالاخره وقت شد تا بشینم و دوباره دست به کی‌برد بشم.
این مقاله Lambda است و انشاء الله تا بعداظهر هم Extention ‌را حاضر می‌کنم امیدوارم خوشتون بیاد :لبخندساده:
اما باز می‌گم نیاز به کمک شما هست .

rezayat
شنبه 10 فروردین 1387, 12:50 عصر
خوب Extension ها را هم حاضر کردم من خودم توی این چندتایی C#3 که اضافه کرده این خاصیت را خیلی دوست دارم پرکاربرد هست و از دردسرهای ارث بری و ماجراهای بعد آن برای اضافه کردن یه تابع کوچیک به کلاس آدم را نجات می‌دهد .
امیدوارم که دوستان خوششون بیاد و در این حرکت مدیران که خبرة این کار هستند انتقاد ها و نظراتشان را بدهند من باز به کار خود ادامه می‌دهم شما هم نقدتون ، تشویقتون یا هرچیزی که به ذهنتون می‌یاد بگید تا این لیست کاملتر بشه بهتر کار روش انجام بشه و اگر جایی قابل فهم نیست اون را درست کنیم.
امیدوارم خوشتون بیاد انشاالله.:لبخندساده:

rezayat
یک شنبه 11 فروردین 1387, 10:18 صبح
خوب دوستان امروز توابع سازنده را می‌زام که نسبتا به مباحث قبلی کمی مرتبط هست .
امیدوارم خوشتون بیاد انشاالله .
در حال روی LINQ هستم البته در ابتدا روی استراکچرش کار می‌کنم که به صورت step step کم کم اون را برای استفاده روی سایت می‌زارم انشاالله:لبخندساده:

rezayat
یک شنبه 22 اردیبهشت 1387, 19:26 عصر
خوب بايد بگم كه اين چند وقت بدجوري دستم بند بود و حالا آزادتر هستم تا اول برج 4
بايد اول تشكر كنم از كسايي كه اصلا كمك نكردند به اينكه اين تاپيك كامل بشه چون مجبور شدم خودم همه مطالب را بدست بيارم.:تشویق:
براي اينكه مطالب زياد هست . من هم دست تنها هستم مطالب تيكه تيكه فرستاده مي‌شه اميدورام خوشتون بياد .
راستي استفاده از اين مطالب با آوردن منبع بلا اشكال است البته من فقط توي اين سايت اينها را نمي زام.
اين مطلب در مورد query هايي است كه در LINQ داريم و من از دوتاي مشهورش شروع كردم يكيselect و ديگري where
اين نكته را هم بايد بگم كه linq هم يكي از قسمت هاش نوشتن query است اما با اين تفاوت كه مي‌شود براي هر شي‌اي كه از ienumerable ها ارث بري كرده نوشت . پس فقط براي كار با database نيست. و مي‌شه گفت كه براي جستجو در شي به صورتي منطقي ايجاد شده .
بايد بگم با توجه به چيزهايي كه ديدم اين كار براي ماكروسافت چندان نبايد طول كشيده باشه. شايد دو سه ماه. البته اين نظر منه.
اميد وارم خوشتون بياد. :لبخندساده:

rezayat
دوشنبه 23 اردیبهشت 1387, 10:44 صبح
خوب قسمت دوم هم براي گذاشتن حاضر شد .
اين قسمت در بردارنده متدهاي selecttype و orderby و انواع آنها مي‌باشد.
انشاءالله كه بشه ادامه داد.
اميدوارم خوشتون امده باشه.:لبخندساده:

rezayat
سه شنبه 24 اردیبهشت 1387, 08:50 صبح
خوب مطلب جديد يكي از مهمترين تابع ها را در بر داره و آن هم Join هست.
امروز نرسيدم اما فكر مي‌كنم بهتره مطالب به صورت txt‌ ارائه بشه تا درمورد آنها بحث بشه.
انشاالله كه بشه ادامه داد.
اميدوارم خوشتون بياد.:لبخندساده:

rezayat
چهارشنبه 25 اردیبهشت 1387, 11:18 صبح
خوب اينبار سعي مي‌كنم كه كد را همينجا به صورت text‌ بيارم تا در مورد اون بحث بشه البته اين قسمت بحث چنداني نداره.
آوردن بخشي و يا كل اين مطالب با آوردن منبع و مولف بلا اشكال است.

Set Operators كه به دو دسته تقسيم مي‌شوند . Distinct و union, intersect, except
Distinct :
فرض كنيد كه شما بخواهيد كه داده‌هايي كه ايجادشده است را كاوش كرده و داده‌هاي تكراري را حذف كنيد و يكي از آنها را نگهداري كنيد . براي هيمن از اين متد استفاده مي‌كنيم كه به صورت زير تعريف مي‌شود.

public static IEnumerable<T> Distinct<T>(
this IEnumerable<T> source);

يك مثال براي اين مطلب به صورت زير است.

var expr =
customers
.SelectMany(c => c.Orders)
.Join(products,
o => o.IdProduct,
p => p.IdProduct,
(o, p) => p)
.Distinct();
اگر بخواهيم به صورت يك عبارت جستجو اين كار را انجام دهيم به صورت زير است .

var expr =
(from c in customers
from o in c.Orders
join p in products
on o.IdProduct equals p.IdProduct
select p
).Distinct();

به پرانتز ها توجه كنيد .
در حالت معمولي اين متد با مقايسه كار مي‌كند كه بيشتر با hash كدهايي است كه براي هر داده داريم و يا از متد camparer استفاده مي‌كند و باز همان قضيه قبلي .اما مي‌توان اين متد كه در يك كلاس هست را overload كرد كه باعث مي‌شود . همان گونه كه ما نياز داريم اين حذف تكراري ها انجام شود.
پيدا سازي آن به صورت زير خواهد بود.

public static IEnumerable<T> Distinct<T>(
this IEnumerable<T> source,
IEqualityComparer<T> comparer);
Union, Intersect, Except
كه union براي اتصال دو جستجو است و intersect‌براي تقسيم دو جستجو است و Except ‌ نيز براي تفريق دو جستجو است .
كه به صورت‌هاي زير تعريف مي‌شوند.

public static IEnumerable<T> Union<T>(
this IEnumerable<T> first,
IEnumerable<T> second);

public static IEnumerable<T> Union<T>(
this IEnumerable<T> first,
IEnumerable<T> second,
IEqualityComparer<T> comparer);


public static IEnumerable<T> Intersect<T>(
this IEnumerable<T> first,
IEnumerable<T> second);

public static IEnumerable<T> Intersect<T>(
this IEnumerable<T> first,
IEnumerable<T> second,
IEqualityComparer<T> comparer);


public static IEnumerable<T> Except<T>(
this IEnumerable<T> first,
IEnumerable<T> second);

public static IEnumerable<T> Except<T>(
this IEnumerable<T> first,
IEnumerable<T> second,
IEqualityComparer<T> comparer);
متد union هم مقدار اول خود را و هم مقدار دوم خود را yield‌كرده و آنها را پست سر هم با حذف تكرار خواهد آورد.
مثالي از اين متد.

var expr = customers[1].Orders.Union(customers[2].Orders);
در هنگام مقايسه از hash كد هاي ايجاد شده در هنگام ايجاد هست كه استفاده مي‌شود براي مثال كد بالا مقدار ‌هاي زير را بر‌مي‌گرداند.

10 - False - July – 1
20 - True - December – 3
20 - True - December - 3
كه دو رديف آخر مشابه هستند .دليل اين اتفاق اين است كه شما در هنگام ايجاد اين رديف ها آنها را جدا جدا تعريف كرده‌ايد كه hash كد‌هايي متفاوت ايجاد مي‌كنند.

customers[1] = new Customer {Name = "Marco", City = "Torino",
Country = Countries.Italy, Orders = new Order[] {
new Order {Quantity = 10, IdProduct = 1 ,
Shipped = false, Month = "July"},
new Order {Quantity = 20, IdProduct = 3 ,
Shipped = true, Month = "December"}}};
customers[2] = new Customer {Name = "James", City = "Dallas",
Country = Countries.USA, Orders = new Order[] {
new Order {Quantity = 20, IdProduct = 3 ,
Shipped = true, Month = "December"}}};

براي اينكه اين كد درست جواب دهد بايد شما كلاس order ر ايكبار ديگر پياده سازي كنيد .

public class Order {
public int Quantity;
public bool Shipped;
public string Month;
public int IdProduct;
public override string ToString() {
return String.Format("{0} - {1} - {2} - {3}",this.Quantity, this.Shipped, this.Month, this.IdProduct);
}

public override bool Equals(object obj) {
if (!(obj is Order))
return false;
else {
Order o = (Order)obj;
return(o.IdProduct == this.IdProduct &&
o.Month == this.Month &&
o.Quantity == this.Quantity &&
o.Shipped == this.Shipped); }
}

public override int GetHashCode() {
return String.Format("{0}|{1}|{2}|{3}", this.IdProduct,
this.Month, this.Quantity, this.Shipped).GetHashCode();
}
}

راه ديگر اين هست كه شما به جاي ايجاد كلاس از struct ها استفاده كنيد كه باعث مي‌شود كه مقادير byvalue باشند و ديگر اين مشكل ايجاد ‌نوشد. اما اين كار هميشه ممكن نيست.

public struct Order {
public int Quantity;
public bool Shipped;
public string Month;
public int IdProduct;
}
اين هم مثال هايي از دو تابع بعدي

var expr1 = customers[1].Orders.Intersect(customers[2].Orders);
var expr2 = customers[1].Orders.Except(customers[2].Orders);

كه اگر در حالت عبارت جستجو بياوريم خواهيم داشت.

var expr =
(from c in customers
from o in c.Orders
where c.Country == Countries.Italy
select o
).Intersect(
from c in customers
from o in c.Orders
where c.Country == Countries.USA
select o);
انشاالله كه ادامه داشته باشه
اميدوارم كه خوشتون امده باشه .:لبخندساده:
اين هم pdf اون.

rezayat
دوشنبه 30 اردیبهشت 1387, 19:37 عصر
قاعده همون بالايي ايست كه گفته شده بحث در اين موردها بسيار راه گشا خواهد بود
آوردن بخشي و يا كل اين مطالب با آوردن منبع و مولف بلا اشكال است.

Aggregate Operators(Count, LongCount, Sum, Min, Max, Average, and Aggregate)
خوب حالا ديگر وقت معرفي تابع هاي معروف رسيده است.
تابع count كه براي شمارش تعداد شي هاست .فرض كنيد كه بخواهيد كه براي هر مشتري تعداد سفارش‌هاي او را بدست بياوريد . بايد از راه مثال زير عمل كنيد.

var expr =
from c in customers
select new {c.Name, c.City, c.Country, OrdersCount = c.Orders.Count() };
اين تابع يعني همين count داراي چند حالت پياده سازي است. كه به صورت زير هست.


public static int Count<T>(
this IEnumerable<T> source);

public static int Count<T>(
this IEnumerable<T> source,
Func<T, bool> predicate);

public static long LongCount<T>(
this IEnumerable<T> source);

public static long LongCount<T>(
this IEnumerable<T> source,
Func<T, bool> predicate);
تفاوت مابين longcount و count فقط در مورد نوع برگرداننده است. در مورد پارامتر دوم كه يك تابع هست براي اين است كه مشخص كند كه آيا Null‌نيز شمارش شود يا نه؟
تابع sum
كه به دو حالت زير تعريف شده است .

public static Numeric Sum(
this IEnumerable<Numeric> source);

public static Numeric Sum<T>(
this IEnumerable<T> source,
Func<T, Numeric> selector);
Numeric نوعي است كه مي‌تواند يكي از حالت هاي int int? double double? Float float? Decimal decimal? مي باشد.
حاصل براي يك مجموعه خالي صفر است و براي Null ها null .
int[] values = { 1, 3, 9, 29 };
int total = values.Sum();
يك مثال ديگه كه از نوع دوم استفاده مي‌كنند.

var expr =
from c in customers
join o in (
from c in customers
from o in c.Orders
join p in products
on o.IdProduct equals p.IdProduct
select new { c.Name, OrderAmount = o.Quantity * p.Price }
) on c.Name equals o.Name
into customersWithOrders
select new { c.Name,
TotalAmount = customersWithOrders.Sum(o => o.OrderAmount) };
تابع هاي بعدي Min و Max است كه پياده سازي‌ آنها به صورت زير است.

public static Numeric Min/Max(
this IEnumerable<Numeric> source);

public static T Min<T>/Max<T>(
this IEnumerable<T> source);

public static Numeric Min<T>/Max<T>(
this IEnumerable<T> source,
Func<T, Numeric> selector);

public static S Min<T, S>/Max<T, S>(
this IEnumerable<T> source,
Func<T, S> selector);
نوع اول براي وقتي است نوع آنها از نوع numeric باشد كه بحث آن شد.

var expr =
(from c in customers
from o in c.Orders
select o.Quantity
).Min();
اما نوع دوم براي نوع T بايد نوعي باشد كه از اينترفيس IComprable ارث برده باشد اگر اين طور نباشد باعث ايجاد يك خطا خواهد شد . در زير يك مثال كه باعث خطا مي‌شود را خواهيد ديد.

var expr =
(from c in customers
from o in c.Orders
select new { o.Quantity}
).Min();
شما براي اينكه بتوانيد اين مشكل را حل كنيد مي‌توانيد كه از كد زير كه از نوع سوم پياده سازي استفاده كرده استفاده كنيد به اين صورت ديگر نيازي به نوع T از نوع IComperable نخواهد بود .
(البته اين قضيه را من خودم به شخصه دارم تحقيق مي‌كنم چون چندان روشن نبود كه چرا چنين مي‌شود اما مي‌دانم هر چه باشد زير سر new هست.)
يك نكته كه بايد تذكر داد اين است كه مقدار‌هاي Null‌باعث ايجاد يك Exception خواهد شد كه از نوع ArgumentNullException است.


var expr =
(from c in customers
from o in c.Orders
select new { o.Quantity}
).Min(o => o.Quantity);


Average
اين تابع از يك مجموعه ميانگين را برخواهد گرداند كه كاملا از اسم آن پيداست و به حالت‌هاي زير پياده سازي ‌مي‌شود.

public static Result Average(
this IEnumerable<Numeric> source);

public static Result Average<T>(
this IEnumerable<T> source,
Func<T, Numeric> selector);
نوع مورد نظر براي اين تابع نوع غير null‌ از نوع Numeric‌هست.
وقتي نوع از نوع int long باشند نوع برگشتي از نوع Double هست
و وقتي نوع از نوع long? Int? باشند نوع برگشتي از نوع Double? هست.
ممكن است در داده‌هاي خيلي زياد اين تابع باعث OverFlow شود و اين تابع براي Numeric ها نوشته شده است اگر بخواهيم از نوع‌هايي غير از اين نوع استفاده كنيم بايد از selector مناسب استفاده كنيم.

var expr =
(from p in products
select p.Price
).Average();
var expr =
(from p in products
select new { p.Price }
).Average(p => p.Price);
نوع دوم بيشتر در زماني استفاده مي‌شود كه علاوه بر مقدارهايي از مجموعه نياز به بيان ميانگيني از مجموعة زير مجموعه خودمان هستيم براي مثال در زير براي هر مشتري علاوه بر نام ميانگين مقدار سفارش او را مي‌خواهيد .

var expr =
from c in customers
join o in (
from c in customers
from o in c.Orders
join p in products
on o.IdProduct equals p.IdProduct
select new { c.Name, OrderAmount = o.Quantity * p.Price }
) on c.Name equals o.Name
into customersWithOrders
select new { c.Name,
AverageAmount = customersWithOrders.Average(o =>
o.OrderAmount) };
كه مقدارهايي به صورت زير برگردانده خواهد شد.
{Name=Paolo, AverageAmount=65}
{Name=Marco, AverageAmount=350}
{Name=James, AverageAmount=600}
{Name=Frank, AverageAmount=1000}
Aggregate : مانند پدري براي تمام توابع بالاست. اما پدري كه مي‌تواند پسران ديگري نيز داشته باشد.
با اين تابع مي‌توان تابع‌هاي بالا ايجاد كرد و بسيار جالب است.
تعريف آن به صورت هاي زير است .

public static T Aggregate<T>(
this IEnumerable<T> source,
Func<T, T, T> func);

public static U Aggregate<T, U>(
this IEnumerable<T> source,
U seed,
Func<U, T, U> func);

public static V Aggregate<T, U, V>(
this IEnumerable<T> source,
U seed,
Func<U, T, U> func,
Func<U, V> resultSelector);
اين عملگر تابع func را به صورت تكراري اجرا مي‌كند كه اين مقدارنتيجه را در هر بار اجرا در انباره‌اي نگهداري كرده و در هر مرحله اين تابع را بامقدار انباره به عنوان پارامتر اول و شروع شده از Seed و مقدار انتخاب شده از مجموعه منبع را به عنوان متغيير دوم و در پايان مقدار انباره را به طور كلي باز خواهد گردانيد.
تفاوت عمده بين امضا‌ اول تابع با دو امضاي ديگر در اين است كه نوع seed در نوع هاي دوم سوم از نوع U است. نوع اول seed را برابر اولين شي از مجموعه قرار داده و قاعدتا نوع آن نيز از همان نوع خواهد بود.
نوع سوم و دوم فقط در تابع selector‌تفاوت دارند كه همانند average قابل توجيه است.

var expr =
from c in customers
join o in (
from c in customers
from o in c.Orders
join p in products
on o.IdProduct equals p.IdProduct
select new { c.Name, o.IdProduct,
OrderAmount = o.Quantity * p.Price }
) on c.Name equals o.Name
into orders
select new { c.Name,
MaxOrderAmount =
orders
.Aggregate((t, s) => t.OrderAmount > s.OrderAmount ?
t : s)
.OrderAmount };


اين مثال پياده سازي از تابع ماكسيمم بود.

var expr =
from p in products
join o in (
from c in customers
from o in c.Orders
join p in products
on o.IdProduct equals p.IdProduct
select new { p.IdProduct, OrderAmount = o.Quantity * p.Price }
) on p.IdProduct equals o.IdProduct
into orders
select new { p.IdProduct,
TotalOrderedAmount =
orders
.Aggregate(0m, (a, o) => a += o.OrderAmount)};
اين مثال هم پياده سازي تابع sum است.

اما مثال زير ديگر قبلا پياده سازي نشده است و براي كار مشخصي ايجاد شده است و به عبارتي فرزندي جديد براي اين پدر است.

var expr =
from c in customers
join o in (
from c in customers
from o in c.Orders
join p in products
on o.IdProduct equals p.IdProduct
select new { c.Name, o.IdProduct, o.Month,
OrderAmount = o.Quantity * p.Price }
) on c.Name equals o.Name into orders
select new { c.Name,
MaxOrder =
orders
.Aggregate( new { Amount = 0m, Month = String.Empty },
(t, s) => t.Amount > s.OrderAmount
? t
: new { Amount = s.OrderAmount,
Month = s.Month })};
كه براي هر مشتري بالاترين قيمتي كه خريد كرده و ماه خريد آن را برمي‌گرداند .
اينجاست كه آدم مي‌گه كيه SQL كه بتونه به اين سادگي همچين كاري را بكنه (البته من خيلي توي SQL‌ حرفه‌اي نيستم اما تا اونجايي كه مي‌دونم اگه نياز به ضرب كردن داشته باشيد مابين داده هاي مجموعتون يا عمليات رياضي خفن عملا پدرتون در آمده است اما ايجا به نظر ساده تر هست.) بعد از extension‌ها اين يكي از بهترين چيزهايي بود كه به من خيلي حال داد. فكر پشت اين قضيه منو واقعا متحير كرد.
اميدوارم كه خوشتون امده باشه .
mailto:masoud.rezayat@gmail.com
اين لينك هم براي اعتراض به تغيير نام خيلج فارس به خليج عربي است در گوگل ارث : شما هم ايراني هستيد پس شركت كنيد.
http://www.petitiononline.com/sos02082/petition-sign.html (http://www.petitiononline.com/sos02082/petition-sign.html?)?

خوب اين هم فايل PDF كه بهتره براي اينكه كدهايي پاياني را بهتر مشاهده كنيد از اين فايل استفاده كنيد من حال گذاشتن مجدد Tab‌را نداشتم

mdssoft
سه شنبه 28 خرداد 1387, 20:23 عصر
واقعا ممنون . این مقاله های کوچک و مفید کمک زیادی به ما تازه کارا می کنه :خجالت:

rezayat
جمعه 19 مهر 1387, 10:10 صبح
خوب دوستي به من ميل زده بود و از متن delegate ها انتقادي داشت براي همين من سعي كردم كه دليگيت‌ها را كاملا در چند بخش معرفي كنم اما بايد بگم كه من در اينجا قرار بر اين داشتم ساختار جديد را معرفي كامل كنم نه ساختار‌هاي قديمي را . و فقط تغييرات ساختار هاي قديمي را بگم اما خوب چون براي كار باlinq نياز زيادي به درك دليگيت بود اين متن ها را جمعه به جمعه در همين قسمت مي‌گزارم.

اميدوارم دوستان كه در اين زمينه (دليگيت و LINQ ) اطلاعاتي دارند براي استفاده دوستانشون هم كه شده بگزارند.

اميدوارم خوشتون بياد
تا بعد