сгруппировать внутри списка объектов и изменить - PullRequest
0 голосов
/ 13 октября 2019

Я получил список из класса, подобного этому:

List<clsLinkObject> FinalValsLinks = new List<clslinkObject>();

, и класс содержит:

public class clsLinkObject
    {
        public string clientCode { get; set; }
        public string clienteName { get; set; }
    public string units { get; set; }

    }

Он заполняется через программу FinalValsEnlaces.Add (myLinkObj);Таким образом, он заканчивается списком объектов, код клиента которых может быть повторен. Мне нужно сгруппировать повторяющиеся и добавить единицы измерения:

  • выбрать все повторяемые clientCode.
  • Добавьте все эти единицы
  • Удалите их и просто добавьте одну с итогом.

Итак, есть ли простой и прямой способ сделать это, или просто пройтись по ним и создать новый объект? Если бы итерационный путь был проще, было бы лучше создать новый объект или изменить тот, который у меня есть?

foreach(var objadd in FinalValsLinks)
{//count and add
string tmpclientN= "";
tmpclientN = objadd.clientCode 

...
}

заранее спасибо.

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Вы можете достичь этого, используя Linq.

Приведенный ниже оператор linq сгруппирован на основе clientCode и возвращает сгруппированные (уникальные) записи с суммой единиц.

finalValsLinks = finalValsLinks.GroupBy(f => f.clientCode).Select(g => 
        {
            var first = g.First();
            return new clsLinkObject() {clientCode = first.clientCode, clienteName = first.clienteName, units = g.Sum(c => c.units)};
        }).ToList();

Я изменил определение единиц на int. В случае, если у вас есть требование иметь единицы в качестве строки, вы можете добавить int.Parse или double.Parse во время операции Sum.

См. эту точечную скрипту, созданную в демосценарий.

1 голос
/ 13 октября 2019

На ваш случай можно ответить, используя функции GroupBy и Select LINQ. Но я думаю, что в вашем конкретном случае это не будет правильным подходом, поскольку вы накапливаете одни и те же данные, и неправильно платить цену за запросы LINQ.

Имейте в виду, что выражения LINQ, хотя и просты в синтаксисене играйте в чудо-среду выполнения и фактически платите цену за операции.

Итак, мое решение для вас - использовать Dictionary (может быть, вместе со списком), например так:

var dictionary = new Dictionary<string, string>(); //The second string is the type of unit. Which might be wrong.

void AddValue(ClsLinkObject clsLinkObject)
{
    if(dictionary.ContainsKey(clsLinkObject.clientCode))
    {
        dictionary[clsLinkObject.clientCode] += clsLinkObject.units;
    }
    else
    {
        dictionary.Add(clsLinkObject.clientCode, clsLinkObject.units);
    }
    //You might add to your list as well, if you really want the list here.
}

Вы также можете создать класс Collection для работы со словарем и списком в одном месте, что мне очень нравится.

Если по какой-либо причине вы абсолютно хотите, чтобы группа по решению сообщала мне иЯ обновлю.

PS Возможно, ваше устройство не string. А в C # принято называть ваши классы с помощью PascalCasing

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