У меня есть этот класс
public enum SubStatus { active, inactive, unset}
public class SubItem
{
public SubStatus Status { get; set; }
public string Value { get; set; }
}
И значения в классе могут выглядеть следующим образом
List<SubItem> list = new List<SubItem>()
{
new SubItem() { Status = SubStatus.active, Value = "1" },
new SubItem() { Status = SubStatus.active, Value = "2" }, //active again, add "2" to the previous
new SubItem() { Status = SubStatus.inactive, Value = "1" },
new SubItem() { Status = SubStatus.active, Value = "2" },
new SubItem() { Status = SubStatus.unset, Value = "2" },
new SubItem() { Status = SubStatus.unset, Value = "1" }, //unset again, add "1" to the previous
new SubItem() { Status = SubStatus.unset, Value = "1" } //unset again, add "1" to the previous
};
Теперь мне нужно объединить строковые значения вместе, если Status
предмета равен Status
предыдущего предмета. поэтому в этом примере результат должен выглядеть следующим образом:
List <SubItem> output = new List<SubItem>()
{
new SubItem() { Status = SubStatus.active, Value = "12" },
new SubItem() { Status = SubStatus.inactive, Value = "1" },
new SubItem() { Status = SubStatus.active, Value = "2" },
new SubItem() { Status = SubStatus.unset, Value = "211" }
};
то, что я пробовал до сих пор, работает, но почему-то я думаю, что этот подход неправильный, и есть лучший способ с linq ...
List<SubItem> result = new List<SubItem>();
SubItem temp = list.FirstOrDefault();
if (temp != null)
{
foreach (SubItem item in list.Skip(1))
{
if (temp.Status == item.Status)
{
temp.Value += item.Value;
}
else if (temp.Status != item.Status)
{
result.Add(temp);
temp = item;
}
}
}
result.Add(temp);