Member 11917879 Ответов: 1

Удалить дубликаты, пока значение суммы, равной моей текстовое поле значение в C#, Windows форм, ASP.NET


Привет всем,

я пытаюсь удалить дубликат до тех пор, пока значение суммы не будет равно значению текстового поля

Имя Моей Таблицы A_table
ID	S_Number	Amount
1	55	100
2	55	100
3	66	100
4	66	100
5	77	100
6	88	100
7	88	100
8	99	100
9	44	100
10	88	100


используя этот quary я могу удалить все дубликаты значений но мне нужно
текстовое поле равно значению суммы таблицы..

Пример: если значение текстового поля равно 900, то в таблице данных должно быть delete 100 amout только сумма 1000 amount для удаления дубликатов ...

Что я уже пробовал:

Я написал запрос Linq

DataClasses1DataContext DB = new DataClasses1DataContext();

var f1 = (from k in DB.A_table
          select k.Amount).Sum();


***// Here i have to write something for "f1" sum value equal to textbox value
***// run "f2" quary untill

var f2 = DB.A_table
       .GroupBy(g => g.S_Number)
       .Where(s => s.Count() > 1)
       .Select(R => R.First());

 foreach (var l in f2)
         {
           DB.A_table.DeleteOnSubmit(l);
        }

            DB.SubmitChanges();

Richard Deeming

Если сумма должна быть меньше или равна значению, то просто выполните цикл по строкам, вычисляя совокупную сумму. Как только эта сумма превысит требуемое значение, удалите текущую строку и все последующие строки.

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

1 Ответов

Рейтинг:
2

Maciej Los

Я не уверен, что хорошо вас понимаю, но, похоже, вы хотите удалять строки из таблицы до тех пор, пока сумма дублированных строк не станет меньше или равна 900. Если да, то вы можете использовать Linq Метод TakeWhile[^].

Видеть:

DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[]
	{
		new DataColumn("ID", typeof(int)),
		new DataColumn("S_Number", typeof(int)),
		new DataColumn("Amount", typeof(int)),
	});

dt.Rows.Add(new object[]{1, 55, 100});
dt.Rows.Add(new object[]{2, 55, 100});
dt.Rows.Add(new object[]{3, 66, 100});
dt.Rows.Add(new object[]{4, 66, 100});
dt.Rows.Add(new object[]{5, 77, 100});
dt.Rows.Add(new object[]{6, 88, 100});
dt.Rows.Add(new object[]{7, 88, 100});
dt.Rows.Add(new object[]{8, 99, 100});
dt.Rows.Add(new object[]{9, 44, 100});
dt.Rows.Add(new object[]{10, 88, 100});

int condition = 900;
var rows2delete = dt.AsEnumerable()
	.GroupBy(x=>x.Field<int>("S_Number")) //group data by S_Number
	.Where(grp=>grp.Count()>1)  //get only duplicated data
	.TakeWhile(grp=>grp.Sum(x=>x.Field<int>("Amount"))<=condition); //take until condition is met
	
Console.WriteLine("Duplicated data to delete:");
foreach(var r in rows2delete)
{
	Console.WriteLine("S_Number = {0} | Amount = {1}", r.Select(x=>x.Field<int>("S_Number")).First(), r.Sum(x=>x.Field<int>("Amount")));
}


Результат:
Duplicated data to delete:
S_Number = 55 | Amount = 200
S_Number = 66 | Amount = 200
S_Number = 88 | Amount = 300