PDA

View Full Version : استفاده از مقادیر درون list<t> پس از ارسال به تابع به صورت پارامتر



arefba
شنبه 06 مهر 1392, 04:24 صبح
فرض می کنیم که من در برنامه ام کلاس زیر رو دارم

public class a { public int ID { set; get; } public string Name { set; get; } }

حالا با استفاده از list جنریک من به تابع زیر اطلاعاتی رو پاس میدم
static public void WriteToFile<T>(List<T> YourList) { //here // how to use ? }


List<a> a1 = new List<a>(); a1 = (from p in context.TblTest select new a { ID = p.ID, Name = p.Name }).ToList(); TestFunction(a1);

سوال اینه چگونه درون تابع از اطلاعاتی که به وسیله پارامتر ارسال شده استفاده کنم
من میخوام درون یک حلقه ردیف به ردیف از اطلاعات رو بخونم و مثلا تو یک فایل تکست قرار بدم

foreach (var item in YourList)
{
item;
}

اون آیتم رو نمیتونم اطلاعات داخلش رو استخراج کنم و بهم تنها این خروجی رو میده
mynamespace.a
در صورتی که اطلاعات درونش هست

مهدی هادیان2
شنبه 06 مهر 1392, 05:22 صبح
بسم الله الرحمن الرحیم
با سلام
به نظر درست میاد؛ تنها یک نکته به ذهنم اومد و اون اینکه در حلقه به هر کدوم از فیلدهای لیست دسترسی داشته باشید.
foreach (var item in YourList)
{
item.Name;
}
موفق باشید.

arefba
شنبه 06 مهر 1392, 05:35 صبح
بسم الله الرحمن الرحیم
با سلام
به نظر درست میاد؛ تنها یک نکته به ذهنم اومد و اون اینکه در حلقه به هر کدوم از فیلدهای لیست دسترسی داشته باشید.
foreach (var item in YourList)
{
item.Name;
}
موفق باشید.

گلم من یه لیست فرستادم براش اصلا خاصیتی به هیچ اسمی نمیاره

مهدی هادیان2
شنبه 06 مهر 1392, 05:47 صبح
بسم الله الرحمن الرحیم

گلم من یه لیست فرستادم براش اصلا خاصیتی به هیچ اسمی نمیاره
111272

arefba
شنبه 06 مهر 1392, 11:05 صبح
مشکل اینجاست که کد من رو درست ندیدی من نمیخوام همیشه از کلاس a داده بگیریم
پس مینویسم
static public void WriteToFile<T>(List<T> YourList)

یه راهنمایی بکنید

FastCode
شنبه 06 مهر 1392, 17:07 عصر
از نظر من راه درست استفاده از یک interface هست:

interface INamed { string Name { get; } }

class a : INamed

static public void WriteToFile(List<INamed> YourList) {
در ضمن پیشنهاد میکنم به جای List از IList برای پارامتر های متودهاتون استفاده کنید.

arefba
شنبه 06 مهر 1392, 17:33 عصر
سپاس ولی ببنیدی من نمیخوام که فقط کلاس a رو بفرستم به این تابع
من ممکنه یه لیست از یه کلاس دیگه که ممکنه ده تا فیلد داشته باشه بفرستم و نمیخوام تو ورودی پارامتر های تابع بگم دقیقا کلاس فلان و یا اینترفیس فلان
در کل میخوام هر لیستی از هر کلاسی ره به این تابع پاس دادم تابع دونهه دونه اطلاعاتش رو در خروجی چاپ کنه

mehdi.mousavi
شنبه 06 مهر 1392, 18:57 عصر
سپاس ولی ببنیدی من نمیخوام که فقط کلاس a رو بفرستم به این تابع من ممکنه یه لیست از یه کلاس دیگه که ممکنه ده تا فیلد داشته باشه بفرستم و نمیخوام تو ورودی پارامتر های تابع بگم دقیقا کلاس فلان و یا اینترفیس فلان در کل میخوام هر لیستی از هر کلاسی ره به این تابع پاس دادم تابع دونهه دونه اطلاعاتش رو در خروجی چاپ کنه

سلام.
پاسخی که آقای FastCode دادن درسته، یعنی شما فقط میتونید کلاس هایی رو به این تابع پاس کنید که اون Interface خاص رو پیاده سازی کرده باشن (البته کدی که نوشتن رو میشه کلی تر هم نوشت، اینکه مثلا بگیم T باید Interface مورد نظر رو حتما پیاده سازی کرده باشه) در غیر اینصورت، اون تابع از کجا باید بدونه که چه Property ها و یا متودهایی روی اون کلاس پاس شده قرار گرفته؟ (البته درسته که میشه با استفاده از Reflection به این اطلاعات رسید، اما این کار کارآمد نیست). اگر مساله اصلی رو برام توضیح بدید که چیه، شاید بتونم راه حل مناسبی برای سناریوی مورد نظرتون ارائه کنم.

موفق باشید.

arefba
شنبه 06 مهر 1392, 19:00 عصر
من میخوام یه کلاس داشته باشم که هر کالکشنی رو که بهش پاس بدم در قالب یک فایل اکسل نمایش بده
برای همین به این کار نیاز دارم
چرا با Reflection کارامد نیست ؟

FastCode
شنبه 06 مهر 1392, 19:53 عصر
من میخوام یه کلاس داشته باشم که هر کالکشنی رو که بهش پاس بدم در قالب یک فایل اکسل نمایش بده
برای همین به این کار نیاز دارم
چرا با Reflection کارامد نیست ؟
http://byterot.blogspot.com/2012/05/performance-comparison-of-code.html
http://programmers.stackexchange.com/questions/143205/reflection-is-using-reflection-still-bad-or-slow-what-has-changed-with-ref

tooraj_azizi_1035
یک شنبه 07 مهر 1392, 12:13 عصر
با استفاده از تعریف قید روی پارامتر:
static public void WriteToFile<T>(List<T> YourList) where T:IYourInterface
{
//YourList.ID
}
IYourInterface دو پراپرتی شما رو در بدنه خودشون باید داشته باشند.

arefba
دوشنبه 08 مهر 1392, 14:19 عصر
ممنون ولی من نمیخوام هر برای هر کلاس یا اینتر فیس یکبار این کار رو انجا بدم میخوام مثل کاری که با گرید میکنیم برای چاپ ( کل گرید رو میفرستیم به فانکشن بدون اینکه بگیم چه فیلد هایی داره ) کل کالکشن رو بفرستیم برای چاپ هر کالکشنی چه اینی که مثل زدم یا هر چیز دیگه بدون اینکه فیلد هاش معلوم بشه مثلا بشه گفت
YourList[0],[0]
یعنی ردیف اول داده ها فیلد اول
این شکلی میخوام

مهرداد صفا
دوشنبه 08 مهر 1392, 17:59 عصر
ممنون ولی من نمیخوام هر برای هر کلاس یا اینتر فیس یکبار این کار رو انجا بدم میخوام مثل کاری که با گرید میکنیم برای چاپ ( کل گرید رو میفرستیم به فانکشن بدون اینکه بگیم چه فیلد هایی داره ) کل کالکشن رو بفرستیم برای چاپ هر کالکشنی چه اینی که مثل زدم یا هر چیز دیگه بدون اینکه فیلد هاش معلوم بشه مثلا بشه گفت
YourList[0],[0]
یعنی ردیف اول داده ها فیلد اول
این شکلی میخوام

با سلام.
در صورتی که ورودی تابع صرفا مجموعه ها هستند می توانید به شکل زیر عمل کنید:

//بسم الله الرحمن الرحیم
//اللهم صل علی محمد و آل محمد

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[, ,] numbers = new int[3, 3, 3];
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
for (int k = 0; k < 3; k++)
numbers[i, j, k] = k;


write(numbers);
}

static void write<t>(t source) where t :System.Collections.IEnumerable
{
foreach (var item in source)
{
if (item is System.Collections.IEnumerable)
write((System.Collections.IEnumerable)item);
else
Console.WriteLine(item.ToString());
}
}


}
}


البته در این مورد که ورودی تابع فقط IEnumerable است، نیازی به تعریف تابع به صورت generic نیست اما ممکن است قصد داشته باشید چند فیلتر در نظر بگیرید. مثلا:


void Write<t>(t source) where t:IEnumerable,MyClass,IMyInterface
{
if(t is IEnumerable)
foreach(var item in source)
write(item);...
else if(item is IMyInterface)
.....
}

}

arefba
سه شنبه 09 مهر 1392, 00:42 صبح
در مورد مثال خودتون درسته ولی این رو ببینید
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{


List<Test> lt=new List<Test>(){
new Test(){ID=1,Name="aref"},
new Test(){ID=2,Name="aref"},
new Test(){ID=3,Name="aref"},
new Test(){ID=4,Name="aref"},
};
List<Test1> lt1 = new List<Test1>(){
new Test1(){ID=1,Name="aref",lName="bozorgmehr"},
new Test1(){ID=2,Name="aref",lName="bozorgmehr"},
new Test1(){ID=3,Name="aref",lName="bozorgmehr"},
new Test1(){ID=4,Name="aref",lName="bozorgmehr"},
};


write(lt);
write(lt1);

Console.ReadKey();
}

static void write<t>(t source) where t : System.Collections.IEnumerable
{

foreach (var item in source)
{
if (item is System.Collections.IEnumerable)
write((System.Collections.IEnumerable)item);
else
Console.WriteLine(item.ToString());
}

}



public class Test
{
public int ID { set; get; }
public string Name { set; get; }
}

public class Test1
{
public int ID { set; get; }
public string Name { set; get; }
public string lName { set; get; }
}

// other class
}
}
خروجی این شکلی میشه
consoleapplication.program.test
در صورتی که من خروجی رو شبیه مثالتون میخوام
فردا پس فردا ممکنه من بخوام یه کالکشن دیگه با هر اسمی رو به برنامه ام اضافه کنم نمیخوام که برم تو کلاسش و برای اون هم تعریف کنم میخوام هر کالکشنی رو دادم بهش خودش ردیف هاش رو بخونه

mehdi.mousavi
سه شنبه 09 مهر 1392, 05:29 صبح
سلام.
ظاهرا اصرار دارید اون کاری که گفتم انجام ندید رو انجام بدید، منظورم استفاده از Reflection هستش.
بسیار خوب، در این صورت باید بدین شکل عمل کنید:


private void Write<T>(IEnumerable<T> list)
{
PropertyInfo[] props = typeof(T)
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.CanRead && p.GetGetMethod(false) != null).ToArray();

foreach (var item in list)
{
foreach (PropertyInfo prop in props)
{
object obj = prop.GetValue(item);
if (obj != null)
Debug.WriteLine(string.Format("{0}: {1}", prop.Name, obj.ToString()));
}
}
}


کد فوق رو فقط "برای شروع" نوشتم، باید اونو بر اساس نیازتون تغییر بدید.

موفق باشید.

arefba
سه شنبه 09 مهر 1392, 15:27 عصر
درود فراوان بر شما
من باید Get properties and values from unknown object رو سرچ میکردم
بالاخره من رو به جواب رسوندید
سپاس فراوان