Здесь у вас есть ленивая оцененная версия этого алгоритма, закодированная в C #:
static bool nextCombination(int[] num, int n, int k)
{
bool finished, changed;
changed = finished = false;
if (k > 0)
{
for (int i = k - 1; !finished && !changed; i--)
{
if (num[i] < (n - 1) - (k - 1) + i)
{
num[i]++;
if (i < k - 1)
{
for (int j = i + 1; j < k; j++)
{
num[j] = num[j - 1] + 1;
}
}
changed = true;
}
finished = (i == 0);
}
}
return changed;
}
static IEnumerable Combinations<T>(IEnumerable<T> elements, int k)
{
T[] elem = elements.ToArray();
int size = elem.Length;
if (k <= size)
{
int[] numbers = new int[k];
for (int i = 0; i < k; i++)
{
numbers[i] = i;
}
do
{
yield return numbers.Select(n => elem[n]);
}
while (nextCombination(numbers, size, k));
}
}
И тестовая часть:
static void Main(string[] args)
{
int k = 3;
var t = new[] { "dog", "cat", "mouse", "zebra"};
foreach (IEnumerable<string> i in Combinations(t, k))
{
Console.WriteLine(string.Join(",", i));
}
}
Надеюсь, это поможет вам!
Это зависит от Вашего сервера базы данных. Используя MySQL, звоните mysql_insert_id()
сразу после Вашего запроса на вставку. Используя PostgreSQL, сначала запросите" select nextval(seq)
" на последовательности и включайте ключ в Вашем запросе на вставку.
Запросы для" select max(id) + 1 from tbl
" могли перестать работать, если другой запрос вставляет запись одновременно.
Это зависит от механизма базы данных, который Вы используете. Некоторый DBMS, как Firebird, например, имеет пункт ВОЗВРАТА, который можно добавить к запросу. Например, если у Вас есть таблица под названием TABLE1 со столбцом автоприращения, названным идентификатором, можно использовать это:
insert into TABLE1(columns...) values (values...) returning ID;
И это возвратило бы вставленный идентификатор точно так же, как регулярный избранный оператор.
iterate
, который isn' t почти столь же хороший как что Вы обеспечили.
– John L
13 October 2010 в 04:08
В php: mysql_insert_id () http://us3.php.net/mysql_insert_id
или
, Если Вы хотели к genterate число от своего mySql запроса Select, Вы могли бы использовать этот РЕДАКТИРОВАНИЕ:
SELECT LAST_INSERT_ID(`1`) + 1 FROM table
В Microsoft Transact SQL вы можете использовать @@ IDENTITY.
например
DECLARE @Table TABLE ( col0 INT IDENTITY, col1 VARCHAR(255), col2 VARCHAR(255))
INSERT INTO @Table (col1, col2) VALUES ('Hello','World!')
SELECT @@Identity
SELECT * FROM @Table
Будьте очень осторожны: очевидно, что select nextval (seq) не работает при высоком параллелизме - какое-то другое соединение может вставляться между моментом, когда вы вставили, и временем, когда вы вызывали select nextval (seq). Всегда тестируйте такой код с помощью средств тестирования с высокой степенью параллелизма.
В SQL Server вставка с использованием оператора select может иметь предложение вывода, которое будет возвращать значение идентификатора и любые другие столбцы, которые могут вам понадобиться, чтобы определить, какой идентификатор относится к какой записи. Если вы используете предложение значений, используйте select scope_identity () сразу после вставки.
В postgres лучший способ сделать что-то вроде:
insert into foos(name) values ('my_foo') returning id;