PDA

View Full Version : چگونه تعداد کارکتر مشخصی نمایش دهیم



bitcob589
پنج شنبه 15 فروردین 1392, 16:34 عصر
با سلام
در دیتابیس یک فیلد وجود دارد که در آن متن ذخیره می شود چگونه می توان در زمان سلکت کردن اگر تعداد کلمات بیشتر از 200 تا بود 100 کارکتر آن را نمایش و به جای مابقی جملات چند نقطه نمایش دهد و اگر تعداد کلمات کمتر از 200 تا بود 50 کارکتر آن را نمایش و به جای مابقی جملات چند نقطه نمایش دهد ضمنا نتیجه سلکت در دیتالیست نمایش داده می شود چگونه می توان با linq چنین کاری انجام داد

alihassanabadi
سه شنبه 20 فروردین 1392, 14:33 عصر
سلام
همه این کارها رو تو همون سلکت میخوای انجام؟

bitcob589
سه شنبه 20 فروردین 1392, 16:05 عصر
سلام
همه این کارها رو تو همون سلکت میخوای انجام؟

بله تمام کارها درون دستور سلکت انجام شود
آیا این امکان وجود دارد تمام کارها درون دستور سلکت انجام شود:متفکر:

alihassanabadi
سه شنبه 20 فروردین 1392, 18:10 عصر
واقعا کار حرفه ای به نظر میرسه
من تلاش کردم ولی با این سناریو جور در نیومد
ولی میشد بگی اکه تعداد کارکتر ها بیشتر از 200 تا بود 100 کارکتر را بردار و اگر کمتر بود 50 تا بردار و بعلاوه ... کن
تو همون سلکت این کار شد ولی با این وقت کم دیگه نشد بیشتر تلاش کنم.
ولی در کل شدنیه باید به تمام متدها مسلط باشی
و در آخر بگم این کار تو چند خط جدا به راحتی قابل انحامه
بدرود.

bitcob589
سه شنبه 20 فروردین 1392, 19:27 عصر
ولی میشد بگی اکه تعداد کارکتر ها بیشتر از 200 تا بود 100 کارکتر را بردار و اگر کمتر بود 50 تا بردار و بعلاوه ... کن
تو همون سلکت این کار شد

اگر امکان دارد کد را بگذارید

Mahmoud.Afrad
چهارشنبه 21 فروردین 1392, 01:01 صبح
راه اول:
یک کلاس ایجاد کنید و ExtensionMethod شبیه کد زیر بنویسید.
در این متد براساس جداکننده هایی ، تعداد کلمات را بدست بیارید. بعد هم به ازای تعداد مورد نظر توسط یک متد private رشته را اصلاح کنید. البته بایستی در select یک شئ از entity مورد نظر new کنید.
مثال:
(در اینجا نام entity(نام جدول دیتابیس) tbl است. آنرا مطابق نام entity خود تغییر دهید)
TextContent نام پراپرتی(نام ستون) است که متن در آن است:

public static class myExtensionMethods
{
private static char[] chSplitters = { ' ', '.', ',', ';', '،' };
public static IEnumerable<tbl> GetModifiedObjects(this IEnumerable<tbl> source)
{
var result = from rec in source
select new tbl
{
id = rec.id,
firstname = rec.firstname,
lastname = rec.lastname,
TextContent = GetModifiedContent(rec.TextContent)
};
return result.ToList();
}

private static string GetModifiedContent(string content)
{
int wordCount = content.Split(chSplitters).Count();
if (wordCount > 200)
{
if (content.Length > 100)
return content.Substring(0, 100) + "...";
else
return content;
}
else
{
if (content.Length > 50)
return content.Substring(0, 50) + "...";
else
return content;
}
}
}

نسبت دادن به دیتاسورس هم هیچ تفاوتی نداره چون در سلکت اشیائی از جنس entity را سلکت کردیم. پس برای این مثال:

listBox1.DataSource = db.tbl.GetModifiedObjects();
listBox1.DisplayMember = "TextContent";
listBox1.ValueMember = "id";




راه دوم:
راه دیگه هم اینه که، همه رکوردهای مورد نظر را سلکت کنید(میتوانید به تعداد مورد نظر رکورد دریافت کنید و یا هر شرط دیگری را قبل از Tolist به کار ببرید) و درون لیستی بریزید و با یک حلقه متن مورد نظر را اصلاح کند:

private char[] chSplitters = { ' ', '.', ',', ';', '،' };
private void button1_Click(object sender, EventArgs e)
{
List<tbl> lstTbl = db.tbl.ToList();
lstTbl.ForEach(rec => rec.TextContent = GetModifiedContent(rec.TextContent));
listBox1.DataSource = lstTbl;
listBox1.DisplayMember = "TextContent";
listBox1.ValueMember = "id";
}
private string GetModifiedContent(string content)
{
int wordCount = content.Split(chSplitters).Count();
if (wordCount > 200)
{
if (content.Length > 100)
return content.Substring(0, 100) + "...";
else
return content;
}
else
{
if (content.Length > 50)
return content.Substring(0, 50) + "...";
else
return content;
}
}

alihassanabadi
چهارشنبه 21 فروردین 1392, 09:17 صبح
سلام
من اومدم برای اینکه آبجکتی تر شه یک استراکچر درست کردم و یک لیست از اون رو با شرایط شما پر میکنم
ابتدا structure

public struct Detail
{
public string Name
{
set;
get;
}
}

بعد متدی که قراره لیست رو برگردونه

public List<Detail> GetList()
{
_dbContext = new YourDataContext();
List<Detail> v = (from users in _dbContext.GetTable<User>()
select new Detail
{
Name = (users.Username.Length > 10) ? users.Username.Substring(0, 5) + "..."
: ((users.Username.Length > 4) ? users.Username.Substring(0, 3)+".................." : users.Username)
}
).ToList();

return v;
}

شما کافیه YourDataContext و User رو با کانتکس و جدول خودت تغییر بدی
توجه کنید که اگر فیلد username تعداد کارکترهایش بیشتر از ده تا باشه 5 تا رو جدا میکنه و ... هم بهش اضافه میکنه اگه نه میره چک میکنه اگه از 4 بزرگتر بود 3 تا رو بر میداره بعلاوه ................... میکنه در غیر این دو صورت
خود فیلد رو میده این چک کردن میتونه همینجوری ادامه پیدا کنه اگه شرایط دیگه ای هم بخواید داشته باشید
ولی اصل سناریو شما رو میشه تو جند خط جدا اجرا کرد.
موفق باشید.