it-swarm.dev

حدد قيمًا مميزة من عمود DataTable كبير

لدي DataTable يحتوي على 22 عمودًا ويسمى أحد الأعمدة "id". أرغب في الاستعلام عن هذا العمود والاحتفاظ بجميع القيم المميزة في القائمة. يمكن أن يحتوي الجدول على ما بين 10 إلى مليون صف.

ما هي أفضل طريقة للقيام بذلك؟ أستخدم حاليًا حلقة من أجل الانتقال عبر العمود ومقارنة القيم ، وإذا كانت القيم هي نفسها ، فستنتقل إلى التالي وعندما لا تكون هي نفسها تضيف المعرّف إلى الصفيف. لكن بما أن الطاولة يمكن أن تحتوي على 10 إلى مليون صف ، فهناك طريقة أكثر فاعلية للقيام بذلك! كيف يمكنني القيام بذلك بشكل أكثر كفاءة؟

24
user2545743

الطريقة 1:

   DataView view = new DataView(table);
   DataTable distinctValues = view.ToTable(true, "id");

الطريقة 2: سيكون عليك إنشاء فصل يطابق أسماء أعمدة البيانات الخاصة بك ومن ثم يمكنك استخدام طريقة الامتداد التالية لتحويل Datatable إلى قائمة

    public static List<T> ToList<T>(this DataTable table) where T : new()
    {
        List<PropertyInfo> properties = typeof(T).GetProperties().ToList();
        List<T> result = new List<T>();

        foreach (var row in table.Rows)
        {
            var item = CreateItemFromRow<T>((DataRow)row, properties);
            result.Add(item);
        }

        return result;
    }

    private static T CreateItemFromRow<T>(DataRow row, List<PropertyInfo> properties) where T : new()
    {
        T item = new T();
        foreach (var property in properties)
        {
            if (row.Table.Columns.Contains(property.Name))
            {
                if (row[property.Name] != DBNull.Value)
                    property.SetValue(item, row[property.Name], null);
            }
        }
        return item;
    }

وبعد ذلك يمكنك الحصول على متميزة من القائمة باستخدام

      YourList.Select(x => x.Id).Distinct();

يرجى ملاحظة أن هذا سيعود لك سجلات كاملة وليس فقط معرفات.

43
Ehsan

هذا سيعود لك معرفات مميزة

 var distinctIds = datatable.AsEnumerable()
                    .Select(s=> new {
                        id = s.Field<string>("id"),                           
                     })
                    .Distinct().ToList();
28
Rajeev Kumar

dt- اسم جدول البيانات الخاص بك

ColumnName- اسم العمود الخاص بك ، بمعنى

DataView view = new DataView(dt);
DataTable distinctValues = new DataTable();
distinctValues = view.ToTable(true, ColumnName);
11
Veer

جرب هذا:

var idColumn="id";
var list = dt.DefaultView
    .ToTable(true, idColumn)
    .Rows
    .Cast<DataRow>()
    .Select(row => row[idColumn])
    .ToList();
3
Alex Filipovici

آسف لنشر الرد على موضوع قديم جدا. جوابي قد يساعد الآخرين في المستقبل.

string[] TobeDistinct = {"Name","City","State"};
DataTable dtDistinct = GetDistinctRecords(DTwithDuplicate, TobeDistinct);

    //Following function will return Distinct records for Name, City and State column.
    public static DataTable GetDistinctRecords(DataTable dt, string[] Columns)
       {
           DataTable dtUniqRecords = new DataTable();
           dtUniqRecords = dt.DefaultView.ToTable(true, Columns);
           return dtUniqRecords;
       }
2
Mou