【发布时间】:2017-02-28 11:40:32
【问题描述】:
假设我有一个数组
{ "w", "w", "z", "a", "c", "r", "f", "d", "e", "c", "g", "f", "m", "z" }
我有一条规则,所有的“c”都应该移到“f”之前。 在遵守规则的同时尽可能保持与原始顺序最接近的目标。 一个真实的例子是一个应用程序,它知道某个插件“A”应该高于加载列表中的某个插件“B”。
所以预期的结果是:
将 c 移到第一个 f 之前:
{ "w", "w", "z", "a", "c", "r", "c"<<, "f", "d", "e", "g", "f", "m", "z" }
或
在最后一个 c 之后移动 f:
{ "w", "w", "z", "a", "c", "r", "d", "e", "c", >>"f", "g", "f", "m", "z" }
是否可以使用 LINQ 或任何准备用于此目的的东西?
我尝试了OrderBy(x => x == "c" ? 0 : x == "f" ? 1 : (int?)null),但它会将元素移动到末尾。我只想对特定元素进行排序,但尽可能保持它们相对于其他元素的位置。
更新
该解决方案应该适用于任何输入:
public static char GetLetter(Random rand)
{
string chars = "abcdefghijklmnopqrstuvwxyz";
int num = rand.Next(0, chars.Length - 1);
return chars[num];
}
public static IEnumerable<string> Sort(IEnumerable<string> enumerable, string first, string second)
{
???
}
static void Main(string[] args)
{
Random rand = new Random();
string[] input = Enumerable.Range(1, 10).Select(x => GetLetter(rand) + "").ToArray();
var result = Sort(Sort(input, "c", "f"), "m", "e");
}
支持多个元素(“m”、“c”、“f”)和多个规则是可取的,如果它不会使事情变得太复杂的话。
【问题讨论】:
-
是否可以使用
List<string>代替?这允许您在指定的索引处插入/删除,这使得这更容易。它可以用数组完成,但比单行 LINQ 更难。 -
这是发生在内存中还是 LINQ 被转换成 SQL?
-
@RobLang 在内存中
-
您是否受限于使用阵列使用的相同内存块,或者您是否能够执行复制到新阵列的方法? (取决于你的实物大小)
-
@RobLang 没有具体的性能限制,复制就可以了