Я работаю над старым проектом, который связан со счетами.
Моя проблема в том, что предыдущий программист поместил некоторые значения в неправильный столбец.
Чтобы быть более конкретным, он поместил общую сумму в столбец «кредит» вместо столбца «плата».
Я хочу исправить эти значения и переместить их в правильный столбец с помощью 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
}
}
}
}
Что такое Customer
? Что такое CustomerList
? Что такое KartelesPelaton
? Также имейте в виду, что LINQ предназначен для запросов. Но вы можете запросить данные в новом формате и заменить старые данные результатом.
пожалуйста, преобразуйте греческие имена переменных в английские, чтобы их было легче понять.
Вам нужен следующий код?
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;
}
}
}
}
Отлично, спасибо. Это именно то, что я хотел. Я не верил, что это так просто. На самом деле я сделал это раньше, но я забыл сделать столбец «Кредит» нулевым, поэтому он дал мне тот же результат, поэтому я подумал, что сделал это неправильно, и мне пришлось сохранить изменения.
Как упоминалось в комментариях, 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
Вы обрабатываете свои задания параллельно в нескольких потоках. Но это нужно только в том случае, если у вас очень много работы: stackoverflow.com/questions/6036120/…
Не уверен, что понимаю, о чем вы спрашиваете, можете ли вы привести работающий пример, пожалуйста?