我目前正在开发.NET 4.7.2应用程序。我需要将2个列表合并为1个并替换某些元素。我想知道实现此目标的最佳方法是什么。
问题如下:我有给定的水果列表:
Fruits
------
Apple
Banana
Orange
Lemon
我需要在结果列表中使用上方的水果,该结果使用下面的2个列表创建。列表模板和选择仅包含字符串值。 A,B ...在“选择”和“模板”中将以相同的顺序完全相同。在模板中,我只是将一些水果占位符添加到选择中。
我的2个列表如下:
Template | Selection
---------------------
A | A
Fruit | Orange
D | D
Fruit | Lemon
C | C
Fruit | B
B |
目标是创建一个基于模板的结果列表。我需要用Selection中的水果替换Fruit占位符。如果没有选择的水果,例如C和D之间,则需要从“水果”列表中取出第一个可用的水果。
创建结果时,我从“水果”中切出“橙色”和“柠檬”-我只是从“水果”列表中选择了第一个可用的水果,以替换模板列表中的“水果”占位符,例如首先,我从水果中切出橘子和柠檬,然后选择苹果,因为它仍然可用。
结果看起来像这样:
Result
------
A
Orange
D
Lemon
C
Apple
B
合并这些列表非常棘手。
我班的FruitGarden看起来像这样:
public class FruitGarden
{
public List<string> Fruits { get; set; } // Apple, Banana, Orange, Lemon
public List<string> PrepareFruits(List<string> Template, List<string> Selection)
{
var result = new List<string>();
var cntSelection = 0;
for (var cntTemplate = 0; cntTemplate < Template.Count; cntTemplate++){
// here I need to replace the Fruit in my Template list with an available Fruit from Temporary or from Fruits
do
{
}(cntSelection< Temporary.Count)
}
return result;
}
}
在C#中,您有什么建议将2个列表合并为1个好方法?
答案 0 :(得分:1)
假设随机字符串不能为Boolean
,并且用尽def require(func: PartialFunction[T, Boolean]):Boolean = {
val left = eventsToBeProcessed.dropWhile(!func.isDefinedAt(_))
left.headOption.forall(head => {
eventsToBeProcessed = left.tail
func(head)
})
}
意味着要使用左第一行Fruit
,这是我的尝试:
Selection
我认为使用Fruits
会比每次public List<string> PrepareFruits(List<string> Template, List<string> Selection) {
var result = new List<string>();
var cntSelection = Selection.Count;
var cntTemplate = Template.Count;
var workFruits = new LinkedList<string>(Fruits);
var idxSelection = 0;
for (var idxTemplate = 0; idxTemplate < cntTemplate; ++idxTemplate) {
if (Template[idxTemplate] == "Fruit") {
if (idxTemplate+1 == cntTemplate || (idxSelection < cntSelection && Selection[idxSelection] != Template[idxTemplate + 1])) { // must be a Fruit selection
result.Add(Selection[idxSelection]);
workFruits.Remove(Selection[idxSelection]);
++idxSelection;
}
else {
result.Add(workFruits.First());
workFruits.RemoveFirst();
}
}
else {
result.Add(Template[idxTemplate]);
++idxSelection;
}
}
return result;
}
跳过一个水果时复制其余LinkedList
更好,但这取决于{{1}的数量}以及workFruits
缺少元素的频率。