Как я могу переместить данные столбца в другой столбец в той же строке, используя linq

Я работаю над старым проектом, который связан со счетами.

Моя проблема в том, что предыдущий программист поместил некоторые значения в неправильный столбец.

Чтобы быть более конкретным, он поместил общую сумму в столбец «кредит» вместо столбца «плата».

Я хочу исправить эти значения и переместить их в правильный столбец с помощью linq, но я не знаю, как это сделать. Я искал в Интернете, но я не мог найти что-то подобное.

Я использую этот код для получения счетов для клиента

foreach (Customer customer in CustomerList)
{
    foreach (KartelesPelaton p in customer.KartelesPelaton.OrderBy(p => p.Imerominia))
    {
        if (p.IsInvoice)
        {

            if (p.Credit.HasValue)
            {
                //Change this record data from p.Credit to p.Charge
            }
        }
    }
}

Не уверен, что понимаю, о чем вы спрашиваете, можете ли вы привести работающий пример, пожалуйста?

Haytam 10.04.2019 13:15

Что такое Customer? Что такое CustomerList? Что такое KartelesPelaton? Также имейте в виду, что LINQ предназначен для запросов. Но вы можете запросить данные в новом формате и заменить старые данные результатом.

Sergey Berezovskiy 10.04.2019 13:17

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

Grigoris Loukidis 10.04.2019 13:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
200
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужен следующий код?

foreach (Customer customer in CustomerList)
{ 
    foreach (KartelesPelaton p in customer.KartelesPelaton.OrderBy(p => p.Imerominia))
    {
        if (p.IsInvoice)
        {
            if (p.Credit.HasValue)
            {
                p.Charge = p.Credit;
                p.Credit = null;
            }
        }
    }
}

Отлично, спасибо. Это именно то, что я хотел. Я не верил, что это так просто. На самом деле я сделал это раньше, но я забыл сделать столбец «Кредит» нулевым, поэтому он дал мне тот же результат, поэтому я подумал, что сделал это неправильно, и мне пришлось сохранить изменения.

rippergr 10.04.2019 13:34

Как упоминалось в комментариях, Linq предназначен для запросов, а не для циклов.

Если вам нужен «крутой» Foreach, вы можете сделать это с помощью Parallel.Foreach:

Parallel.ForEach(CustomerList.SelectMany(c => c.KartelesPelaton), k => { if (k.IsInvoice) k.Charge = k.Credit; k.Credit = 0; });

Полный пример

public class Customer
{
    public int Id { get; set; }
    public List<KartelesPelaton> KartelesPelaton { get; set; }

    public override string ToString() => "Id " + this.Id + ":" + String.Join(", ", this.KartelesPelaton.Select(s => s));
}

public class KartelesPelaton
{
    public bool IsInvoice { get; set; }
    public int Credit { get; set; }
    public int Charge { get; set; }

    public override string ToString() => "Is " + (this.IsInvoice ? "" : "NOT ") + "Invoice! " + Credit + " - " + Charge;
}

public static void Main(string[] args)
{
    // Some example-data..
    List<Customer> CustomerList = new List<Customer>()
    {
        new Customer() { Id = 1, KartelesPelaton = new List<KartelesPelaton>() { new KartelesPelaton() { IsInvoice = false, Credit = 1 } } },
        new Customer() { Id = 2, KartelesPelaton = new List<KartelesPelaton>() { new KartelesPelaton() { IsInvoice = true, Credit = 2 }, new KartelesPelaton() { Credit = 22 } } },
        new Customer() { Id = 3, KartelesPelaton = new List<KartelesPelaton>() { new KartelesPelaton() { IsInvoice = true, Credit = 3 } } },
    };

    // Let's see what we got..
    Console.WriteLine("Before:");
    foreach (Customer c in CustomerList)
    {
        Console.WriteLine(c);
    }

    // Select items to modify (customers seem not to be important here..)
    var itemsToModify = CustomerList.SelectMany(c => c.KartelesPelaton);
    // Process the items
    Parallel.ForEach(itemsToModify, k => { if (k.IsInvoice) k.Charge = k.Credit; k.Credit = 0; });

    Console.WriteLine("After:");
    foreach (Customer c in CustomerList)
    {
        Console.WriteLine(c);
    }
}

Какая разница, если использовать Parallel.Foreach вместо foreach

rippergr 10.04.2019 13:40

Вы обрабатываете свои задания параллельно в нескольких потоках. Но это нужно только в том случае, если у вас очень много работы: stackoverflow.com/questions/6036120/…

kara 10.04.2019 13:48

Другие вопросы по теме