پاک کردن آیتم های یک متغیر از نوع List

bitaroos

Member
(زبان C#.net)

سلام مجدد

یه مشکل جدید برام به و جود اومد

برای پاک کردن تمام مقادیر موجود در یک لیست تک بعدی از دستور زیر استفاده می کردم
کد:
List<int> x = null;
.
.
.

x.Add(90);

.
.
.

x.Clear();
-------------
-----------------

حالا برای یک لیست چند بعدی چجوری تمام آیتم های توش رو پاک کنم؟ (البته بدو ن استفاده از حلقه for)

-----------------
------------
-----
-
تشکر
 
آخرین ویرایش:

the_king

مدیرکل انجمن
شما یک لیست چند بعدی نساخته اید، در یک آرایه دو بعدی یک عالمه لیست یک بعدی ساخته اید. اون List ها هم
کمکی هم به متغیر بودن تعداد سطر و ستون نمی کنه چون تعداد لیست ها ثابته، این تعداد اعضاء لیست ئه که متغیره
که شما هم همیشه یک عضو داخلش Add می کنید.
 

bitaroos

Member
شما یک لیست چند بعدی نساخته اید، در یک آرایه دو بعدی یک عالمه لیست یک بعدی ساخته اید. اون List ها هم
کمکی هم به متغیر بودن تعداد سطر و ستون نمی کنه چون تعداد لیست ها ثابته، این تعداد اعضاء لیست ئه که متغیره
که شما هم همیشه یک عضو داخلش Add می کنید.

آره متوجه شدم اشتباه کردم، و اومدم از کد زیر استفاده کردم
کد:
list<list<int>> x;

مشکلم حل شد.

راهی نیست که یه آرایه درست کنیم که تعداد سطر و ستونش در ابتدا مشخص نباشه؟
 

the_king

مدیرکل انجمن
آره متوجه شدم اشتباه کردم، و اومدم از کد زیر استفاده کردم
کد:
list<list<int>> x;

مشکلم حل شد.

راهی نیست که یه آرایه درست کنیم که تعداد سطر و ستونش در ابتدا مشخص نباشه؟

آرایه های #C همه شون همینطور اند، در تعریف متغیر آرایه تعداد سطر و ستون مشخص نیست و بعدا
می توانید تغییر اش دهید.

اگر مقادیر قبلی مهم نیستند آرایه را مجددا ایجاد کنید :
کد:
            int[,] a;
            a = new int[5, 5];
            a = new int[10, 10];

وگرنه برای حفظ کردن مقادیر قبلی در یک آرایه دو بعدی :
کد:
            int[,] a;
            a = new int[5, 5];
            ResizeArray(ref a, 10, 10);

کد:
        void ResizeArray(ref int[,] a, int x, int y)
        {
            int[,] temp = (int[,])a.Clone();
            int u = Math.Min(x, temp.GetLength(0));
            int v = Math.Min(x, temp.GetLength(1));
            a = new int[x, y];
            for (int i = 0; i < u; i++)
                for (int j = 0; j < v; j++)
                    a[i, j] = temp[i, j];
        }
 

bitaroos

Member
آرایه های #C همه شون همینطور اند، در تعریف متغیر آرایه تعداد سطر و ستون مشخص نیست و بعدا
می توانید تغییر اش دهید.

اگر مقادیر قبلی مهم نیستند آرایه را مجددا ایجاد کنید :
کد:
            int[,] a;
            a = new int[5, 5];
            a = new int[10, 10];
وگرنه برای حفظ کردن مقادیر قبلی در یک آرایه دو بعدی :
کد:
            int[,] a;
            a = new int[5, 5];
            ResizeArray(ref a, 10, 10);
کد:
        void ResizeArray(ref int[,] a, int x, int y)
        {
            int[,] temp = (int[,])a.Clone();
            int u = Math.Min(x, temp.GetLength(0));
            int v = Math.Min(x, temp.GetLength(1));
            a = new int[x, y];
            for (int i = 0; i < u; i++)
                for (int j = 0; j < v; j++)
                    a[i, j] = temp[i, j];
        }

نه، منظورم این نبود

فرض کنید یه عکس داریم مثل عکس زیر سمت چپی

attachment.php



با یه سری فیلتر، عکس سمت راست تولید میشه.

یه عکس میکروسکوپی از سطح پوشش داده شده ی یه ماده است. که می تونه لایه های متفاوتی داشته باشه
حالا این عکس از سه لایه تشکیل شده ولی میتونه لایه هاش بیشتر یا کمتر هم باشه.
کاربر تعداد خطوط عمودی رو مشخص میکنه تا برنامه روی خطوط حرکت کنه و ضخامت لایه ها رو بدست بیاره.
وقتی ضخامت هر لایه مشخص شد، همون موقع باید وارد یه آرایه بشه

یعنی از قبل تعریف نمی کنیم که آرایه چند در چند باشه، یعنی اصلا تعریف نکنیم آرایه چند در چنده، ولی بتونیم درایه هاش رو پر کنیم

من با استفاده از یه لیست تو در تو تونستم اینکار رو بکنم، ولی می خواستم بدونم با آرایه ها هم میشه این کار رو کرد؟
 

پیوست ها

  • 19345f3.jpg
    19345f3.jpg
    55.9 کیلوبایت · بازدیدها: 10

the_king

مدیرکل انجمن
نه، منظورم این نبود

فرض کنید یه عکس داریم مثل عکس زیر سمت چپی

attachment.php



با یه سری فیلتر، عکس سمت راست تولید میشه.

یه عکس میکروسکوپی از سطح پوشش داده شده ی یه ماده است. که می تونه لایه های متفاوتی داشته باشه
حالا این عکس از سه لایه تشکیل شده ولی میتونه لایه هاش بیشتر یا کمتر هم باشه.
کاربر تعداد خطوط عمودی رو مشخص میکنه تا برنامه روی خطوط حرکت کنه و ضخامت لایه ها رو بدست بیاره.
وقتی ضخامت هر لایه مشخص شد، همون موقع باید وارد یه آرایه بشه

یعنی از قبل تعریف نمی کنیم که آرایه چند در چند باشه، یعنی اصلا تعریف نکنیم آرایه چند در چنده، ولی بتونیم درایه هاش رو پر کنیم

من با استفاده از یه لیست تو در تو تونستم اینکار رو بکنم، ولی می خواستم بدونم با آرایه ها هم میشه این کار رو کرد؟

شما به همون آرایه دو بعدی int نیاز دارید، List زمانی بکارتان می آمد که تعداد لایه ها در کل تصویر تغییر می کرد،
مثلا ضخامت لایه ها در نقاطی به صفر می رسید.

شما به یک چیزی تو این مایه ها نیاز دارید که من ساخته ام :

attachment.php


LayerAnalyzer.zip
 

پیوست ها

  • Preview.gif
    Preview.gif
    34.4 کیلوبایت · بازدیدها: 9
  • LayerAnalyzer.zip
    335.3 کیلوبایت · بازدیدها: 11

bitaroos

Member
شما به همون آرایه دو بعدی int نیاز دارید، List زمانی بکارتان می آمد که تعداد لایه ها در کل تصویر تغییر می کرد،
مثلا ضخامت لایه ها در نقاطی به صفر می رسید.

شما به یک چیزی تو این مایه ها نیاز دارید که من ساخته ام :

attachment.php


LayerAnalyzer.zip

سلام مجدد
جالب بود، فکر نمی کردم یه مثال کامل برام بزارید.....
ممنون

اون قسمت margin هم ایده ی خیلی خوبی بود، من می خواستم از Crop استفاده کنم ولی اگر اینجوری
مثل مثال شما یه Selection بزارم خیلی بهتره.

اون تابع ReduceNoise رو درست متوجه نشدم، 3 تا حلقه ی تو در تو داره، که یکی از حلقه هاش خیلی عجیبه
کد:
                    for (int nextX = 0; nextX <= 0; nextX++)
                    {
                        newBrightness += bitmap.GetPixel(ba*** + nextX, y + nextY).GetBrightness();
                    }
این حلقه همیشه یه دور میزنه، اصلا چرا تعریف شده؟
توی این تابع، چرا روی محور y به اندازه 5 پیکسل میره جلو؟

اصلا این تابع دقیقا قراره چه کاری رو انجام بده؟

من از یه روش دیگه استفاده کرده بودم، اول یه فیلتر threshold رنگی و بعد هم از فیلتر FillHoles استفاده کرده
بودم. ولی روش کار اون تابع مذکور که شما استفاده کریدید رو متوجه نشدم.
 

the_king

مدیرکل انجمن
سلام مجدد
جالب بود، فکر نمی کردم یه مثال کامل برام بزارید.....
ممنون

اون قسمت margin هم ایده ی خیلی خوبی بود، من می خواستم از Crop استفاده کنم ولی اگر اینجوری
مثل مثال شما یه Selection بزارم خیلی بهتره.

اون تابع ReduceNoise رو درست متوجه نشدم، 3 تا حلقه ی تو در تو داره، که یکی از حلقه هاش خیلی عجیبه
کد:
                    for (int nextX = 0; nextX <= 0; nextX++)
                    {
                        newBrightness += bitmap.GetPixel(ba*** + nextX, y + nextY).GetBrightness();
                    }
این حلقه همیشه یه دور میزنه، اصلا چرا تعریف شده؟
توی این تابع، چرا روی محور y به اندازه 5 پیکسل میره جلو؟

اصلا این تابع دقیقا قراره چه کاری رو انجام بده؟

من از یه روش دیگه استفاده کرده بودم، اول یه فیلتر threshold رنگی و بعد هم از فیلتر FillHoles استفاده کرده
بودم. ولی روش کار اون تابع مذکور که شما استفاده کریدید رو متوجه نشدم.
این فیلتری که من بکار برده ام Reduce Colors ئه، یعنی تعداد رنگ های تصویر رو کم می کنه.
یک خط عمودی وسط تصویر رو از بالا به پایین پیمایش می کنه و چند رنگ کاملا متمایز که بیشترین فراوانی رو دارند
بدست می آره که رنگ همون لایه ها است. چون فراوانی رنگ نویز همیشه کمتر از رنگ خود لایه است.

بعد در کل تصویر رنگ نقاط رو بر اساس ترتیب لایه ها با همین چند رنگ خاص مجددا رنگ می کنه. در نتیجه نویز در
تصویر بطور کامل حذف می شه و یک تصویر یکدست بدست می آید.

اگر تصویر اصلا نویز نداشته باشه، یعنی کل یک لایه دقیقا یک رنگ خاص باشه، شما صرفا رنگ نقطه (x, y) را
می خوانید و نیازی به نویز گیری نیست. اما در تصاویری مثل نمونه های شما، لایه ها نویز دارند، اونهم در حد
نسبتا بالا. اگر شما رنگ نقاط مجاور رو با هم مقایسه کنید، تقریبا رنگ هیچ نقطه ای دقیقا مشابه نقطه مجاور نیست.

اگر نویز ها رو نگیرید و فقط از threshold استفاده بشه، باز به مشکل بر می خورید، چون اگر حساسیت threshold
کم باشه، لایه هایی که رنگ شون نزدیک به همه رو یک لایه در نظر می گیره. اگر هم حساسیت بالا باشه،
بعضی نقاطی که تجمع نویز زیادی دارند رو مرز لایه جدید در نظر می گیره.

اون حلقه رو برای این اضافه کردم اگه نویز افقی تصاویر خیلی زیاد بود، بازه nextX رو از 1- تا 1 یا 2- تا 2 و حتی بیشتر
عوض کنید. در تصاویر نمونه نیازی به اینکار نبود، اما چون نویز عمودی در شمارش لایه ها تاثیر داشت، بجای رنگ یک
نقطه، از رنگ 5 نقطه مجاور میانگین می گیریم. اگر واقعا با لایه جدیدی روبرو شوید، میانگین 5 نقطه رنگ لایه جدید
است، اما اگر با نویز روبرو شوید، میانگین به رنگ لایه فعلی خیلی نزدیک است و با مقدار حساسیتی که تنظیم
می کنید، این اختلاف ناچیز نادیده گرفته می شود.
 

جدیدترین ارسال ها

بالا