Что лучший способ состоит в том, чтобы удалить дубликаты из таблицы данных?

Инициализатор UIImagePNGRepresentation принимает экземпляр UIImage, а не Data, поэтому замените

if let imageData = UIImagePNGRepresentation(image.pngData()) {

на

if let imageData = UIImagePNGRepresentation(image) {

ИЛИ лучше используйте последнюю версию Путь

if let imageData = image.pngData() {   

7
задан unwind 4 December 2008 в 11:20
поделиться

8 ответов

Можно использовать Linq для Наборов данных. Проверьте это. Что-то вроде этого:

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

List<DataRow> rows = new List<DataRow>();

DataTable contact = ds.Tables["Contact"];

// Get 100 rows from the Contact table.
IEnumerable<DataRow> query = (from c in contact.AsEnumerable()
                              select c).Take(100);

DataTable contactsTableWith100Rows = query.CopyToDataTable();

// Add 100 rows to the list.
foreach (DataRow row in contactsTableWith100Rows.Rows)
    rows.Add(row);

// Create duplicate rows by adding the same 100 rows to the list.
foreach (DataRow row in contactsTableWith100Rows.Rows)
    rows.Add(row);

DataTable table =
    System.Data.DataTableExtensions.CopyToDataTable<DataRow>(rows);

// Find the unique contacts in the table.
IEnumerable<DataRow> uniqueContacts =
    table.AsEnumerable().Distinct(DataRowComparer.Default);

Console.WriteLine("Unique contacts:");
foreach (DataRow uniqueContact in uniqueContacts)
{
    Console.WriteLine(uniqueContact.Field<Int32>("ContactID"));
}
8
ответ дан 6 December 2019 в 10:55
поделиться

Как я могу удалить дублирующиеся строки?. (Скорректируйте запрос там для присоединения на 4 столбцах ключа),

Править: с Вашей новой информацией я полагаю, что самый легкий путь состоял бы в том, чтобы реализовать IEqualityComparer <T> и использование, Отличное на Ваших строках данных. Иначе, если Вы работаете с IEnumerable/IList вместо DataTable/DataRow, это, конечно, возможно с некоторым кун-фу LINQ к объектам.

Править: пример IEqualityComparer

public class MyRowComparer : IEqualityComparer<DataRow>
{

    public bool Equals(DataRow x, DataRow y)
    {
        return (x.Field<int>("ID") == y.Field<int>("ID")) &&
            string.Compare(x.Field<string>("Name"), y.Field<string>("Name"), true) == 0 &&
          ... // extend this to include all your 4 keys...
    }

    public int GetHashCode(DataRow obj)
    {
        return obj.Field<int>("ID").GetHashCode() ^ obj.Field<string>("Name").GetHashCode() etc.
    }
}

Можно использовать его как это:

var uniqueRows = myTable.AsEnumerable().Distinct(MyRowComparer);
7
ответ дан 6 December 2019 в 10:55
поделиться

Если у Вас есть доступ к Linq, я думаю, что необходимо смочь использовать созданный в функциональности группы на в наборе памяти и выбрать дублирующиеся строки

Поисковый Google для Linq Group для примеров

1
ответ дан 6 December 2019 в 10:55
поделиться

Ответ Liggett78 намного лучше - особенно, поскольку шахта имела ошибку! Исправление следующим образом...

DELETE TableWithDuplicates
    FROM TableWithDuplicates
        LEFT OUTER JOIN (
            SELECT PK_ID = Min(PK_ID), --Decide your method for deciding which rows to keep
                KeyColumn1,
                KeyColumn2,
                KeyColumn3,
                KeyColumn4
                FROM TableWithDuplicates
                GROUP BY KeyColumn1,
                    KeyColumn2,
                    KeyColumn3,
                    KeyColumn4
            ) AS RowsToKeep
            ON TableWithDuplicates.PK_ID = RowsToKeep.PK_ID
    WHERE RowsToKeep.PK_ID IS NULL
0
ответ дан 6 December 2019 в 10:55
поделиться

Найденный этим на bytes.com:

Можно использовать провайдер OLE DB Jet 4.0 с классами в Системе. Данные. Пространство имен OleDb для доступа к файлу разделенного текста запятой (использующий Набор данных/Таблицу данных).

Или Вы могли использовать текстовый Драйвер Microsoft для ODBC с классами в Системе. Данные. Пространство имен Odbc для доступа к файлу с помощью драйверов ODBC.

Это позволило бы Вам получать доступ к своим данным с помощью запросов SQL как предложенные другие.

0
ответ дан 6 December 2019 в 10:55
поделиться

Используйте запрос вместо функций:

DELETE FROM table1 AS tb1 INNER JOIN 
(SELECT id, COUNT(id) AS cntr FROM table1 GROUP BY id) AS tb2
ON tb1.id = tb2.id WHERE tb2.cntr > 1
0
ответ дан 6 December 2019 в 10:55
поделиться

"Эта таблица данных создается путем чтения файла CSV а не от DB".

Таким образом поместите ограничение на уникальность данных на четыре столбца в базе данных, и вставляет, которые являются дубликатами при Вашем дизайне, не войдет. Если это не решает перестать работать вместо того, чтобы продолжиться, когда это происходит, но это, конечно, настраивается в Вашем сценарии импорта CSV.

0
ответ дан 6 December 2019 в 10:55
поделиться

Это очень простой код, который не требует linq или отдельных колонок для фильтра. Если все значения столбцов в строке равны null, она будет удалена.


    public DataSet duplicateRemoval(DataSet dSet) 
{
    bool flag;
    int ccount = dSet.Tables[0].Columns.Count;
    string[] colst = new string[ccount];
    int p = 0;

    DataSet dsTemp = new DataSet();
    DataTable Tables = new DataTable();
    dsTemp.Tables.Add(Tables);

    for (int i = 0; i < ccount; i++)
    {
        dsTemp.Tables[0].Columns.Add(dSet.Tables[0].Columns[i].ColumnName, System.Type.GetType("System.String"));
    }

    foreach (System.Data.DataRow row in dSet.Tables[0].Rows)
    {
        flag = false;
        p = 0;
        foreach (System.Data.DataColumn col in dSet.Tables[0].Columns)
        {
            colst[p++] = row[col].ToString();
            if (!string.IsNullOrEmpty(row[col].ToString()))
            {  //Display only if any of the data is present in column
                flag = true;
            }
        }
        if (flag == true)
        {
            DataRow myRow = dsTemp.Tables[0].NewRow();
            //Response.Write("<tr style=\"background:#d2d2d2;\">");
            for (int kk = 0; kk < ccount; kk++)
            {
                myRow[kk] = colst[kk];         

                // Response.Write("<td class=\"table-line\" bgcolor=\"#D2D2D2\">" + colst[kk] + "</td>");
            }
            dsTemp.Tables[0].Rows.Add(myRow);
        }
    } return dsTemp;
}

Это можно использовать даже для удаления нулевых данных из листа excel.

0
ответ дан 6 December 2019 в 10:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: