Sha256: 76e608852e01e97e3325cc6066c7de9979f8b407d8b1df3156f515c82007a3bf

Contents?: true

Size: 1.97 KB

Versions: 24

Compression:

Stored size: 1.97 KB

Contents

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

public static class ListOps
{
    private static List<T> Cons<T>(T x, List<T> input)
    {
        var list = new List<T>(input);
        list.Insert(0, x);

        return list;
    }

    public static int Length<T>(List<T> input)
    {
        return Foldl(input, 0, (acc, x) => acc + 1);
    }

    public static List<T> Reverse<T>(List<T> input)
    {
        return Foldl(input, new List<T>(), (acc, x) => Cons(x, acc));
    }

    public static List<TOut> Map<TIn, TOut>(List<TIn> input, Func<TIn, TOut> map)
    {
        return Foldr(input, new List<TOut>(), (x, acc) => Cons(map(x), acc));
    }

    public static List<T> Filter<T>(List<T> input, Func<T, bool> predicate)
    {
        return Foldr(input, new List<T>(), (x, acc) => predicate(x) ? Cons(x, acc) : acc);
    }

    public static TOut Foldl<TIn, TOut>(List<TIn> input, TOut start, Func<TOut, TIn, TOut> func)
    {
        var acc = start;

        foreach (var item in input)
            acc = func(acc, item);

        return acc;
    }

    public static TOut Foldr<TIn, TOut>(List<TIn> input, TOut start, Func<TIn, TOut, TOut> func)
    {
        var acc = start;

        for (var i = input.Count - 1; i >= 0; i--)
            acc = func(input[i], acc);

        return acc;
    }

    public static List<T> Concat<T>(List<List<T>> input)
    {
        var concatenated = new List<T>();

        foreach (var list in input)
        {
            if (list is List<T> sublist)
                concatenated = Append(concatenated, sublist);
        }
            

        return concatenated;
    }

    public static List<T> Append<T>(List<T> left, List<T> right)
    {
        var appended = new T[left.Count + right.Count];

        for (var i = 0; i < left.Count; i++)
            appended[i] = left[i];

        for (var j = 0; j < right.Count; j++)
            appended[left.Count + j] = right[j];

        return appended.ToList();
    }
}

Version data entries

24 entries across 24 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.179 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.178 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.177 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.176 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.175 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.174 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.173 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.172 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.171 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.170 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.169 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.167 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.166 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.165 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.164 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.163 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.162 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.161 tracks/csharp/exercises/list-ops/Example.cs
trackler-2.2.1.160 tracks/csharp/exercises/list-ops/Example.cs