Комбинация Списка <Список <интервал>>

Для всех, кто спотыкается здесь с проблемой, которую я имел (некоторые, но не все пакеты восстанавливаются на сервере сборки), последний фрагмент головоломки для меня заключался в добавлении NuGet.config в корень моего решения, .SLN-файл, как Дэвид Эббо, объяснил здесь: http://blog.davidebbo.com/2014/01/the-right-way-to-restore-nuget-packages.html .

Из сообщения блога Ebbo, содержимое файла для меня просто



  
    
  

UPDATE:

URL-адрес API NuGet изменен для v3 (текущий по состоянию на сентябрь 2016 года) , Из https://www.nuget.org/


25
задан Garry Shutler 13 February 2009 в 12:43
поделиться

2 ответа

Это весьма схоже с этот ответ , я дал другому вопросу:

var combinations = from a in A
                   from b in B
                   from c in C
                   orderby a, b, c
                   select new List<int> { a, b, c };

var x = combinations.ToList();

Для переменного количества исходных данных, теперь с добавленными дженериками:

var x = AllCombinationsOf(A, B, C);

public static List<List<T>> AllCombinationsOf<T>(params List<T>[] sets)
{
    // need array bounds checking etc for production
    var combinations = new List<List<T>>();

    // prime the data
    foreach (var value in sets[0])
        combinations.Add(new List<T> { value });

    foreach (var set in sets.Skip(1))
        combinations = AddExtraSet(combinations, set);

    return combinations;
}

private static List<List<T>> AddExtraSet<T>
     (List<List<T>> combinations, List<T> set)
{
    var newCombinations = from value in set
                          from combination in combinations
                          select new List<T>(combination) { value };

    return newCombinations.ToList();
}
38
ответ дан 8 revs 15 October 2019 в 15:26
поделиться

Если количество размеров фиксируется, это просто SelectMany:

var qry = from a in A
          from b in B
          from c in C
          select new {A=a,B=b,C=c};

Однако, если количеством размеров управляют по условию, необходимо использовать рекурсию:

static void Main() {
    List<List<int>> outerList = new List<List<int>>
    {   new List<int>(){1, 2, 3, 4, 5},
        new List<int>(){0, 1},
        new List<int>(){6,3},
        new List<int>(){1,3,5}
    };
    int[] result = new int[outerList.Count];
    Recurse(result, 0, outerList);
}
static void Recurse<TList>(int[] selected, int index,
    IEnumerable<TList> remaining) where TList : IEnumerable<int> {
    IEnumerable<int> nextList = remaining.FirstOrDefault();
    if (nextList == null) {
        StringBuilder sb = new StringBuilder();
        foreach (int i in selected) {
            sb.Append(i).Append(',');
        }
        if (sb.Length > 0) sb.Length--;
        Console.WriteLine(sb);
    } else {
        foreach (int i in nextList) {
            selected[index] = i;
            Recurse(selected, index + 1, remaining.Skip(1));
        }
    }
}
14
ответ дан Marc Gravell 15 October 2019 в 15:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: