كيف يمكنني جعل DataTable enumerable?
-
22-07-2019 - |
سؤال
أنا لا يمكن استخدام AsEnumerable() على DataTable, أنا باستخدام C# 3 ولكن أنا فقط استهداف 2.0 إطار (LINQ القدرة هو من باب المجاملة LINQBridge).هل هناك أي طريقة يمكن أن تجعل DataTable enumerable دون استخدام اختيار() ?
bool isExisting = (bdsAttachments.DataSource as DataTable).Select().Any(xxx => (string)dr["filename"] == filename);
تحديث:
أردت أن تجعل الأمر يبدو مثل هذا:
bool isExisting = (bdsAttachments.DataSource as DataTable).AsEnumerable().Any(xxx => (string)dr["filename"] == filename);
أنا أفهم أن حدد طريقة DataTable يعود نسخة, أنا أفكر فقط استخدام AsEnumerable المشكلة أنا فقط استهداف 2.0 إطار النظام.البيانات.DataSetExtensions غير متوفر
راجع للشغل, حاولت هذا: http://cs.rthand.com/blogs/blog_with_righthand/archive/2006/01/15/284.aspx, ولكن لديه أخطاء التحويل البرمجي.
المحلول
public static IEnumerable<DataRow> EnumerateRows(this DataTable table)
{
foreach (var row in table.Rows)
{
yield return row;
}
}
ويتيح لك الاتصال على:
bool isExisting = (bdsAttachments.DataSource as DataTable).EnumerateRows().Any(dr => (string)dr["filename"] == filename);
نصائح أخرى
IEnumerable<DataRow> rows = dataTable.AsEnumerable();
(System.Data.DataSetExtensions.dll)IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>();
(System.Core.dll)
والحفاظ على العداد الخاص بك بدقة 2.0:
public static IEnumerable<DataRow> getRows(DataTable table)
{
foreach (DataRow row in table.Rows)
{
yield return row;
}
}
وثم استدعاء مع linqbridge مثل هذا:
bool isExisting = getRows(bdsAttachments.DataSource as DataTable).Any(row => (string)row["filename"] == filename);
ويمكنك محاولة صب DataTable وكما IEnumerable وتكرار عبر مجموعة:
//your data exists as a DataTable
DataTable dt = (DataTable)bdsAttachments.DataSource;
foreach (DataRow row in dt)
{
if (row["filename"] == filename)
return row;
}
وسوف foreach تكرار خلال قائمة وبحثا عن اسم الملف (أفترض أنك تبحث عن DataRow الأول مع أن اسم الملف، وليس كافة الصفوف التي تطابق اسم الملف).