linq列表数组问题

时间:2011-08-26 13:21:31

标签: linq

我有一项任务是在阵列列表中找到最大的增长继承。

所以,如果我有数组1 5 1 2 3 1 2

输出必须为1 2 3

请帮我完成这项任务。

我可以用linq写这个吗?

4 个答案:

答案 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没有一种方便的方法...