我有一项任务是在阵列列表中找到最大的增长继承。
所以,如果我有数组1 5 1 2 3 1 2
输出必须为1 2 3
请帮我完成这项任务。
我可以用linq写这个吗?
答案 0 :(得分:2)
由于这是一个家庭作业问题,我不会给你一个完整的解决方案,但这里有一些提示:
你需要迭代数字并跟踪两件事:
当前递增序列的长度(最初为0)和序列的最后一个数字(如果数字为正,则最初为-1)。例如,在迭代1和5之后,这两个值将是2(长度)和5(最后一个数字)。
到目前为止发现的最佳序列的长度 - 例如如果您在示例的末尾,当前序列的长度为2(最后两个数字为1和2),但您之前找到了长度为3的序列。
您可以使用LINQ解决此问题 - 您可以使用Aggregate
扩展方法编写保持当前状态的迭代。但是,使用for
循环编写它可能会更容易(特别是如果你正在学习)
答案 1 :(得分:1)
您希望按特定顺序确定数组中多个项目之间的关系。 Linq并不适合这种情况,更容易循环遍历数组,检测每个继承的大小并记住最大的连续性。
答案 2 :(得分:1)
是的,您可以使用linq执行此操作,但代码不是很易读。使用循环可以更清晰地编写代码。
var ind = 0;
var result = ar.Select((i, index) => index > 0 ? new { Val = ar[index], ValIndex = ar[index] > ar[index - 1] ? ind : ++ind } : new { Val = ar[index], ValIndex = 0 }).GroupBy(t => t.ValIndex).Select(x => new { GroupKey = x.Key, Group = x }).OrderByDescending(g => g.Group.Count()).First();
foreach (var r in result.Group)
{
Console.WriteLine(r.Val);
}
答案 3 :(得分:0)
您可以编写类似的方法:
IList<T> GetLongestIncreasingSequence<T>(IEnumerable<T> source)
{
var comparer = Comparer<T>.Default;
List<T> longest = null;
List<T> tmp = new List<T>();
T previous = default(T);
bool first = true;
foreach (var item in source)
{
if (first || comparer.Compare(item, previous) > 0)
{
tmp.Add(item);
}
else
{
if (tmp.Any() && (longest == null || longest.Count < tmp.Count))
{
longest = tmp;
}
tmp = new List<T>();
tmp.Add(item);
}
first = false;
previous = item;
}
if (tmp.Any() && (longest == null || longest.Count < tmp.Count))
{
longest = tmp;
}
return longest;
}
用法:
int[] values = { 1, 5, 1, 2, 3, 1, 2 };
var longest = GetLongestIncreasingSequence(values);
这不是Linq解决方案,但我认为Linq没有一种方便的方法...