PDA

View Full Version : سوال: کار با نوع <IEnumerable<T در متد



siavoshi
یک شنبه 30 مهر 1391, 16:25 عصر
من یک متد دارم که مقدار پارامتر ورودی و نوع برگشتی آن IEnumerable<T>است
این متد را در یک کلاس دیگر می خواهم با یک شی ء از یک کلاس فراخوانی کرده وبه یک شیء از همین کلاس
مقدار دهی کنم.
متد تعریف شده برای کلاس یا نوع خاصی طراحی نشده و می باید هر نوعی را گرفته ،محاسبه کرده و باز گرداند.
با تشکر از راهنمائی شما

مهرداد صفا
دوشنبه 01 آبان 1391, 18:36 عصر
با سلام
اگر منظور شما را درست متوجه شده باشم؛
برای تعریف یک EXTENSION METHOD در C#‎‎ باید اولین آرگومنت ورودی تابع را با کلمه کلیدی this و خود تابع را در یک کلاس static و به صورت static تعریف کنید. به عنوان مثال کلاس زیر دو متود دارد که در مورد هر IEnumerable<T> اجرا میشوند:

//in the name of god
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication1
{
public static class ExtensionClass
{

public static IEnumerable<TSource> FirstHalf<TSource>(this IEnumerable<TSource> Source)
{
int counts = 0;
return from Item in Source where (counts++ < Source.Count() / 2) select Item;
}
public static IEnumerable<T> EvenItems<T>(this IEnumerable<T> Source)
{
int index = 0;
return from value in Source where ++index % 2 == 0 select value;
}
}
}

متود اول نصف اعضای IEnumerable<T> و متود دوم اعضایی که اندیس زوج دارند را برمیگرداند.
برای امتحان درون کلاس مربوط به فرم:

this.Text = new string("abcdefgh".FirstHalf().EvenItems().ToArray());

نتیجه: bd
اگر توضی بیشتر نیاز بود بفرمایید.

gwbasic
دوشنبه 01 آبان 1391, 18:59 عصر
جدا از اینکه متد شما می تواند به صورت Extension Method‌ نوشته شود نکته اینجاست متدی که شما تعریف کردید دنباله ای از ?T‌را می پذیرد که T از نوع struct‌هست یعنی مثلا type‌ هایی مثل ?int و از این دست. در صورتیکه شما bb‌ رو پاس کردین که مسلما یک class‌ هست