PDA

View Full Version : سوال: مقایسه دو datatable



رامین مرادی
پنج شنبه 03 خرداد 1397, 11:28 صبح
سلام وقت بخیر دوستان

من یه دیتا تیبل دارم که چند سطر اطلاعات داره.(4 ستونه)

یه دیتا تیبل دیگه هم دارم به همون صورت.(4 ستونه)

نیاز دارم بررسی کنم که دیتاتیبل 1 محتویاتش توی دیتاتیبل دوم هست یا نه؟
عکسی برای مثال قرار میدم که محتویات دیتاتیبل یک در دیتاتیبل دوم هست اما به صورت نامرتب.

148254
ممنون میشم راهنماییم کنید. (در صورت امکان سریعترین روش رو بیان کنید چون ممکنه تعداد دیتاتیل اول 100 ردیف بشه ولی دیتاتیبل دوم هزار ردیف)

رامین مرادی
پنج شنبه 03 خرداد 1397, 11:43 صبح
خودم این روشو نوشتم ولی حس میکنم میشه بهتر از اینم نوشت. برا افزایش سرعت . چون برای مثال 100*1000 ببینید چندبار حلقه اجرا میشه.



bool state = false;
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < dt2.Rows.Count;j++)
{
if (dt.Rows[i]["TajhizatId"].ToString().Equals(dt2.Rows[j]["TajhizatId"].ToString()))
{
if (dt.Rows[i]["Nobat"].ToString().Equals(dt2.Rows[j]["Nobat"].ToString()))
{
if (dt.Rows[i]["BarCode"].ToString().Equals(dt2.Rows[j]["BarCode"].ToString()))
{
state = true;
}
else
{
state = false;
}
}


}
}
}
MessageBox.Show(state.ToString());

Mahmoud.Afrad
پنج شنبه 03 خرداد 1397, 12:21 عصر
چه ستونی مقادیر یکتا داره؟

رامین مرادی
پنج شنبه 03 خرداد 1397, 14:27 عصر
چه ستونی مقادیر یکتا داره؟
تو این جدول فقط ستون نوبت تغییر میکنه. بقیه ستونها ثابتا" - یعنی ستون کد بررسی و کد تجهیز و بارکد باهم یکتا هستن.


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

336699
پنج شنبه 03 خرداد 1397, 15:14 عصر
تو این جدول فقط ستون نوبت تغییر میکنه. بقیه ستونها ثابتا" - یعنی ستون کد بررسی و کد تجهیز و بارکد باهم یکتا هستن.


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

سوالی که پیش میاد اینه که
ممکن هست فقط یکی از ردیفهای جدول یک داخل جدول دوم باشه ، در این صورت نتیجه true میشه.
اونوقت شما از کجا تشخیص میدی کدوم ردیف بوده و کدام ردیف نبوده؟ یا اینکه مهم نیست یک ردیف یا تمام ردیفهای جدول یک داخل جدول دوم باشند؟

رامین مرادی
پنج شنبه 03 خرداد 1397, 15:51 عصر
سوالی که پیش میاد اینه که
ممکن هست فقط یکی از ردیفهای جدول یک داخل جدول دوم باشه ، در این صورت نتیجه true میشه.
اونوقت شما از کجا تشخیص میدی کدوم ردیف بوده و کدام ردیف نبوده؟ یا اینکه مهم نیست یک ردیف یا تمام ردیفهای جدول یک داخل جدول دوم باشند؟

نه خب باید عینا اگه تمامی رکوردهای جدول 1 در جدول 2 بود اطلاع بده نه اینکه فقط یکی.

336699
پنج شنبه 03 خرداد 1397, 16:40 عصر
از این روش استفاده کنید

نام گذاری جدول ها رو بر اساس شکل بالا انجام دادم (خودتان اصلاح نمایید)

روش کار به این صورت هست که ابتدا تعداد ردیفهای مشترک در جدول یک و جدول دوم رو بدست می آوریم
سپس این عدد بدست آمده رو با تعداد ردیفهای جدول یک مقایسه میکنم اگر برابر بود یعنی تمام ردیفهای جدول یک در جدول دوم وجود دارد و نتیجه true میشود
واگر برابر نبود یعنی فقط بعضی از ردیفهای جدول یک در جدول دوم وجود دارد و نتیجه false میشود


int EqualRows = (DT1.AsEnumerable().Where(a => DT2.AsEnumerable().Any(b => (a["BarCode"].ToString() == b["BarCode"].ToString())))).Count();

if (EqualRows == DT1.Rows.Count)
{
state = true;
}
else
{
state = false;
}

رامین مرادی
شنبه 05 خرداد 1397, 08:27 صبح
از این روش استفاده کنید

نام گذاری جدول ها رو بر اساس شکل بالا انجام دادم (خودتان اصلاح نمایید)

روش کار به این صورت هست که ابتدا تعداد ردیفهای مشترک در جدول یک و جدول دوم رو بدست می آوریم
سپس این عدد بدست آمده رو با تعداد ردیفهای جدول یک مقایسه میکنم اگر برابر بود یعنی تمام ردیفهای جدول یک در جدول دوم وجود دارد و نتیجه true میشود
واگر برابر نبود یعنی فقط بعضی از ردیفهای جدول یک در جدول دوم وجود دارد و نتیجه false میشود


int EqualRows = (DT1.AsEnumerable().Where(a => DT2.AsEnumerable().Any(b => (a["BarCode"].ToString() == b["BarCode"].ToString())))).Count();

if (EqualRows == DT1.Rows.Count)
{
state = true;
}
else
{
state = false;
}





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

336699
شنبه 05 خرداد 1397, 12:27 عصر
ممنون دوست عزیز. فقط شما فقط چرا اسم یک ستون رو اینجا قید کردید؟! من باید همشونو بنویسم؟ شرمنده اینقدر مبتدیانه میگم من تا حالا لینک کار نکردم.:لبخندساده:
وقتی هر سه ستون یکتا هستند
دیگر نیازی نیست هر سه ستون چک بشه
یکی از ستون ها چک بشه کافیه.

رامین مرادی
شنبه 05 خرداد 1397, 14:33 عصر
وقتی هر سه ستون یکتا هستند
دیگر نیازی نیست هر سه ستون چک بشه
یکی از ستون ها چک بشه کافیه.
سه ستون باهم یکتا هستن. مثلا این بارکد میتونه تکراری باشه (
یعنی ستون کد بررسی و کد تجهیز و بارکد باهم یکتا هستن.
)
تو پست شماره 4 هم گفتم.

336699
شنبه 05 خرداد 1397, 15:24 عصر
سه ستون باهم یکتا هستن. مثلا این بارکد میتونه تکراری باشه (
یعنی ستون کد بررسی و کد تجهیز و بارکد باهم یکتا هستن.
)
تو پست شماره 4 هم گفتم.

الان مشکل کجاست ؟ :متفکر:

Mahmoud.Afrad
شنبه 05 خرداد 1397, 21:57 عصر
سه ستون باهم یکتا هستن. مثلا این بارکد میتونه تکراری باشه (
یعنی ستون کد بررسی و کد تجهیز و بارکد باهم یکتا هستن.
)
تو پست شماره 4 هم گفتم.

شرطهای دیگر را با && اضافه کنید.
با استفاده از متد all میتونید بررسی کنید که همه سطرهای اولی در دومی هم باشند.(در آرایه ها اندیس ستونها را قرار بدید)
bool state =
dt1.AsEnumerable().All(dt1Row =>
dt2.AsEnumerable().Any(dt2Row =>
dt2Row.ItemArray[0].Equals(dt1Row.ItemArray[0]) &&
dt2Row.ItemArray[1].Equals(dt1Row.ItemArray[1]) &&
dt2Row.ItemArray[2].Equals(dt1Row.ItemArray[2])
)
);