कैसे एक datatable में अलग पंक्तियों का चयन करें और एक सरणी में स्टोर करें


169

मेरे पास एक डेटासेट objds है। objds में Table1 नाम की एक तालिका होती है। Table1 में ProcessName नाम का कॉलम है। इस प्रक्रियानाम में बार-बार नाम हैं। क्या मैं केवल अलग नामों का चयन करना चाहता हूं। क्या यह संभव है।

  intUniqId[i] = (objds.Tables[0].Rows[i]["ProcessName"].ToString());

नीचे दिए गए एक टिप्पणी से पोस्ट नमूना कोड, ऐसा लगता है कि आप जिस क्वेरी के साथ काम कर रहे हैं उसकी बारीकियों पर जवाब टिका है।
मैथ्मार्टिन

जवाबों:


360
DataView view = new DataView(table);
DataTable distinctValues = view.ToTable(true, "Column1", "Column2" ...);


अगर मेरे पास 2 कॉलम "मो" और "नाम" है, तो मुझे विशिष्ट "मो" प्राप्त करने की आवश्यकता है, लेकिन विशिष्ट "नाम" नहीं, लेकिन मुझे अपने डेटा योग्य में कॉलम "नाम" रखने की आवश्यकता है मैं क्या करूं?
User7291

1
@JocelyneElKhoury, कि वास्तव में कोई मतलब नहीं है ... आप "नाम" का कौन सा मूल्य रखेंगे?
थॉमस लेवेस्क

@ThomasLevesque इससे कोई फर्क नहीं पड़ता कि कौन सा है ... मान लीजिए कि मुझे नाम का पहला मूल्य रखने की आवश्यकता है
User7291

17
ठीक है, फिर आपको समूह बनाने की ज़रूरत है, अलग नहीं। आप इसे Linq के साथ DataSet में कर सकते हैं:table.AsEnumerable().GroupBy(row => row.Field<int>("mo")).Select(group => group.First()).CopyToDataTable()
थॉमस लेवेस्क

148

कोड की एकल पंक्ति का अनुसरण करने से डुप्लिकेट पंक्तियों से बचना होगा DataTable:

dataTable.DefaultView.ToTable(true, "employeeid");

कहाँ पे:

  • पहला पैरामीटर ToTable()एक बूलियन है जो इंगित करता है कि आपको अलग-अलग पंक्तियाँ चाहिए या नहीं।

  • दूसरा पैरामीटर ToTable()कॉलम नाम है जिसके आधार पर हमें अलग-अलग पंक्तियों का चयन करना होगा। केवल ये कॉलम लौटाए गए डिटैटेबल में होंगे।

एक ही से DataSet, एक विशिष्ट का उपयोग करके किया जा सकता है DataTable:

dataSet.Tables["Employee"].DefaultView.ToTable(true, "employeeid");

5
मुझे यह सबसे ज्यादा पसंद है, क्योंकि यह DefaultViewएक की संपत्ति की ओर इशारा करता है DataTable
इयान बोयड

क्या होगा अगर मुझे दो कॉलम के आधार पर अलग-अलग प्राप्त करने की आवश्यकता है?
LCJ

1
@ लिजो, ToTable(boolean, params string[] columnNames)विधि कई कॉलमों को निर्दिष्ट करने की अनुमति देती है।
क्रिस्टन हैमैक

57
DataTable dt = new DataTable();
dt.Columns.Add("IntValue", typeof(int));
dt.Columns.Add("StringValue", typeof(string));
dt.Rows.Add(1, "1");
dt.Rows.Add(1, "1");
dt.Rows.Add(1, "1");
dt.Rows.Add(2, "2");
dt.Rows.Add(2, "2");

var x = (from r in dt.AsEnumerable()
        select r["IntValue"]).Distinct().ToList();

30

LINQ (.NET 3.5, C # 3) के साथ

var distinctNames = ( from row in DataTable.AsEnumerable()
 select row.Field<string>("Name")).Distinct();

 foreach (var name in distinctNames ) { Console.WriteLine(name); }

15

आप इस तरह का उपयोग कर सकते हैं:

data है DataTable

data.DefaultView.ToTable(true, "Id", "Name", "Role", "DC1", "DC2", "DC3", "DC4", "DC5", "DC6", "DC7");  

लेकिन प्रदर्शन नीचे होगा। नीचे दिए गए कोड का उपयोग करने का प्रयास करें:

data.AsEnumerable().Distinct(System.Data.DataRowComparer.Default).ToList();  

प्रदर्शन के लिए; http://onerkaya.blogspot.com/2013/01/distinct-dataviewtotable-vs-linq.html


13
var distinctRows = (from DataRow dRow in dtInventory.Rows
                                select dRow["column_name"] ).Distinct();

var distinctRows = (from DataRow dRow in dtInventory.Rows
                                select dRow["col1"], dRow["col2"].. ).Distinct();

@ एडी लेस्टर: शायद नए {col1 = dRow ["col1"], col2 = dRow ["col2"], ...}) का चयन करें। distinct (); क्या ज्यादा सही है?
यूरिक

जब आपके पास बस एक सूची है <DataRow> आप यह कर सकते हैं: var test = (vm.LiveAssets में DataRow dRow से dRow ["manname"] का चयन करें)। Distinct ();
पॅट कैपोज़ी

पहली पंक्ति काम करती है। दूसरा, जैसा कि यूरिक बताते हैं, लेकिन यूरिक भी डिस्टिक्ट () के रूप में काम नहीं करता है, जब गुमनाम प्रकारों पर ऑब्जेक्ट-तुलना करते हुए समानता नहीं मिलेगी।
एलन बलजे

9

उपर्युक्त उत्तर को बेहतर बनाने के लिए: डेटाविषय पर टोटेबल फ़ंक्शन में "विशिष्ट" ध्वज होता है।

//This will filter all records to be distinct
dt = dt.DefaultView.ToTable(true);

1
यह काम नहीं करता है। इसमें एक अलग बूलियन पैरामीटर के साथ केवल एक अधिभार है और इसके लिए पैरामीटर सरणी की आवश्यकता होती है। मुझे लगता है कि यह बिना किसी DISTINCT के लागू किए हुए "ट्रू" नामक तालिका को लौटा देगा।
प्राग्वेकदाद

2
+1 यह वास्तव में काम करता है (कम से कम .NET 4.5 में)। यदि आप बूलियन मान "ट्रू" को एकमात्र पैरामीटर के रूप में निर्दिष्ट करते हैं, तो यह DataView में सभी स्तंभों पर एक DISTINCT करता है।
SetFreeByTruth

4

निम्नलिखित कार्य। मेरे पास .NET 3.5 SP1 के साथ यह मेरे लिए काम कर रहा है

// Create the list of columns
String[] szColumns = new String[data.Columns.Count];
for (int index = 0; index < data.Columns.Count; index++)
{
    szColumns[index] = data.Columns[index].ColumnName;
}

// Get the distinct records
data = data.DefaultView.ToTable(true, szColumns);

3

मैं सिर्फ इसे खोजने के लिए हुआ: http://support.microsoft.com/default.aspx?scid=kb;en-us-326176#1;

कुछ इसी तरह की तलाश करते हुए, केवल, विशेष रूप से .net 2.0 के लिए

Im मान कर रहा है कि DataTable.Select () का उपयोग करते समय OP अलग दिख रहा था। (चुनें) अलग से समर्थन नहीं करता है

तो यहाँ उपरोक्त लिंक से कोड है:

class DataTableHelper 
{
    public DataTable SelectDistinct(string TableName, DataTable SourceTable, string FieldName)
    {   
        DataTable dt = new DataTable(TableName);
        dt.Columns.Add(FieldName, SourceTable.Columns[FieldName].DataType);

        object LastValue = null; 
        foreach (DataRow dr in SourceTable.Select("", FieldName))
        {
            if (  LastValue == null || !(ColumnEqual(LastValue, dr[FieldName])) ) 
            {
                LastValue = dr[FieldName]; 
                dt.Rows.Add(new object[]{LastValue});
            }
        }

        return dt;
    }

    private bool ColumnEqual(object A, object B)
    {

        // Compares two values to see if they are equal. Also compares DBNULL.Value.
        // Note: If your DataTable contains object fields, then you must extend this
        // function to handle them in a meaningful way if you intend to group on them.

        if ( A == DBNull.Value && B == DBNull.Value ) //  both are DBNull.Value
            return true; 
        if ( A == DBNull.Value || B == DBNull.Value ) //  only one is DBNull.Value
            return false; 
        return ( A.Equals(B) );  // value type standard comparison
    }
}

2
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

वाक्य - विन्यास:-

DataTable dt = ds.Tables[0].DefaultView.ToTable(true, "ColumnName");

पूर्व: -

DataTable uniqueCols = dsUDFlable.Tables[0].DefaultView.ToTable(true, "BorrowerLabelName");

2

सबसे सरल समाधान LINQ का उपयोग करना है और फिर परिणाम को डेटाटेबल में बदलना है

    //data is a DataTable that you want to change
    DataTable result = data.AsEnumerable().Distinct().CopyToDataTable < DataRow > ();

यह केवल asp.net 4.0 ^ फ्रेमवर्क के लिए मान्य है और इसे System.Data.DataSetExtensions के संदर्भ में इवान फेरारी विला के रूप में संदर्भित करने की आवश्यकता है


1
शायद यह करने के लिए संदर्भ की जरूरत हैSystem.Data.DataSetExtensions
इवान फेरर विला


1
DataTable dt = new DataTable("EMPLOYEE_LIST");

DataColumn eeCode = dt.Columns.Add("EMPLOYEE_CODE", typeof(String));
DataColumn taxYear = dt.Columns.Add("TAX_YEAR", typeof(String));
DataColumn intData = dt.Columns.Add("INT_DATA", typeof(int));
DataColumn textData = dt.Columns.Add("TEXT_DATA", typeof(String));

dt.PrimaryKey = new DataColumn[] { eeCode, taxYear };

यह डेटा टेबल को इकोबॉक्‍स और टैक्‍योर के साथ संयुक्त रूप से यूनिक माना जाता है


0

यह आसान है

    DataView view = new DataView(dt);
DataTable dt2 = view.ToTable(true, "Column1", "Column2","Column3", ...,"ColumnNth");

और dt2 डेटाटेबल में कॉलम 1, कॉलम 2..कोल्यूमेंट अद्वितीय डेटा होते हैं।


0
objds.Table1.Select(r => r.ProcessName).AsEnumerable().Distinct();

हाय @ GálGyula, ढेर अतिप्रवाह में आपका स्वागत है! यहां हम अच्छे स्पष्टीकरण के साथ उत्तरों की परवाह करते हैं, न कि केवल कोड की। केवल एक उत्तर पोस्ट करें यदि यह वास्तव में प्रश्न हल करता है और आप बता सकते हैं कि कैसे। अपने भविष्य के उत्तरों को बेहतर बनाने के लिए, एक गाइड देखें कि मैं एक अच्छा उत्तर कैसे लिखूं
इरिक पेट्रुकेली

-1

पसंद है?

DISTINCT का चयन करें .... तालिका से जहां हालत

http://www.felixgers.de/teaching/sql/sql_distinct.html

नोट: होमवर्क सवाल? और भगवान का आशीर्वाद गूगल ।।

http://www.google.com/search?hl=en&rlz=1C1GGLS_enJO330JO333&q=c%23+selecting+distinct+values+from+table&aq=f&oq=&aqi=


3
किसने मुझे नीचा दिखाया: एस ,, जाहिर है कि मेरे जवाब के बाद सवाल संशोधित किया गया था ?? (उत्तर १०:१५, १२:१५ पर प्रश्न संपादित) ओह वेल .. उर अज्ञान के लिए :) :)
मैडी डी।

2
ओपी C # ado.net वातावरण में अलग-अलग पंक्तियों का चयन करने के लिए कहता है, वास्तविक डेटाबेस में नहीं।
एगटन 20

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.