static string ToCsv<T>(IEnumerable<T> things, Func<T, string> toStringMethod)
{
StringBuilder sb = new StringBuilder();
foreach (T thing in things)
sb.Append(toStringMethod(thing)).Append(',');
return sb.ToString(0, sb.Length - 1); //remove trailing ,
}
Использование как это:
DataTable dt = ...; //datatable with some data
Console.WriteLine(ToCsv(dt.Rows, row => row["ColName"]));
или:
List<Customer> customers = ...; //assume Customer has a Name property
Console.WriteLine(ToCsv(customers, c => c.Name));
у меня нет компилятора для вручения, но в теории он должен работать. И как все знают в теории, практика и теория являются тем же. На практике они не.
Подумайте, как вы делаете деление на бумаге. Вы смотрите на первую или две цифры и записываете ближайшее кратное семи, переносите остаток и так далее. Вы можете сделать это с любым числом произвольной длины, потому что вам не нужно загружать все число в память.
вы можете использовать известное правило о делении на 7, который говорит: сгруппируйте каждые 3 цифры вместе, начиная справа, и начните вычитать и складывать их поочередно, делимость результата на 7 такая же, как и у исходного числа:
Пример:
testing 341234612736481253489125349812643761283458123548213541273468213
549821354182354891623458917245921834593218645921580
(580-921+645-218+593-834+921-245+917-458+623-891+354-182
+354-821+549-213+468-273+541-213+548-123+458-283+761-643
+812-349+125-489+253-481+736-612+234-341
= 1882 )
% 7 != 0 --> NOK!
есть другие альтернативы этому правилу, все легко реализовать.
Большинство правил деления на семь работают на уровне цифр, поэтому у вас не должно возникнуть проблем с их применением к вашей строке.
Вы можете вычислить значение числа по модулю 7.
То есть для каждой цифры d и значения n на данный момент вычислить n = (10 * n + d)% 7.
Это имеет то преимущество, что работает независимо от делителя 7 или основания 10.
Я бы начал с вычитания большого числа, которое делится на 7.
Примеры чисел, которые делятся на 7, включают 700, 7000, 70000, 140000000, 42000000000 и т. Д.
В конкретном примере, который вы дали, попробуйте вычесть 280000000000 (некоторое количество нулей) 0000.
Еще проще реализовать, многократно вычтите максимально возможное число, например 70000000000 (некоторое количество нулей) 0000.
Поскольку я недавно работал с разбивкой чисел, я намекну, что для получения конкретных чисел - это то, что вы потребуется с некоторыми другими ответами - подумайте о целочисленном делении и использовании модуля, чтобы получить из него цифры.
Если бы у вас было меньшее число, скажем 123
, как бы вы получили ] 1
, 2
и 3
из него? Тем более что вы работаете по базе 10 ...