Для тех, кто использует Newtonsoft Json.NET , читайте о том, как это сделать через Native JSON в IE8, Firefox 3.5 плюс Json. NET .
Также полезна документация по изменению формата дат, написанная Json.NET: Сериализация дат с помощью Json.NET
Для тех, кто слишком ленив. вот быстрые шаги. Поскольку JSON имеет свободную реализацию DateTime, вам нужно использовать IsoDateTimeConverter()
. Обратите внимание, что начиная с Json.NET 4.5 формат даты по умолчанию - ISO, поэтому приведенный ниже код не требуется.
string jsonText = JsonConvert.SerializeObject(p, new IsoDateTimeConverter());
JSON будет выглядеть как
"fieldName": "2009-04-12T20:44:55"
Наконец, немного JavaScript для преобразования даты ISO в дату JavaScript:
function isoDateReviver(value) {
if (typeof value === 'string') {
var a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(?:([\+-])(\d{2})\:(\d{2}))?Z?$/.exec(value);
if (a) {
var utcMilliseconds = Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]);
return new Date(utcMilliseconds);
}
}
return value;
}
Я использовал это так
$("").text(isoDateReviver(item.fieldName).toLocaleString()).appendTo("#" + divName);
Что вы можете сделать, так это загрузить исходный код по ссылке , которую вы обнаружили в Code Project. Разархивируйте его, загрузите решение в Visual Studio и скомпилируйте его. Это даст вам исходный код, неуправляемую dll c и файл .lib.
Вы можете P / Invoke вызывать функции в этой DLL (экспортируется только 5 простых функций, из которых вам нужны только две) или вы можете использовать эту DLL, библиотеку и файл заголовка SFMT для создания управляемой DLL-оболочки. вы можете использовать в C # без P / Invoke. Я просто попробовал этот метод, и это оказалось очень просто. Явного упорядочивания не было.
Вот как это сделать. После того, как вы загрузили и скомпилировали исходный код (вам понадобится заголовок и файл библиотеки, который создается в дополнение к dll), создайте новый проект библиотеки классов C ++ CLR. Назовите это WrapSFMT или что-то в этом роде. Зайдите в свойства проекта. В разделе C ++ / Предварительно скомпилированные заголовки измените значение на «Не использовать предварительно скомпилированные заголовки». В Linker / General / Additional Library Directories введите путь к SFMT.lib. В Linker / Input / Additional Dependencies добавьте SFMT.lib. Закройте страницы свойств. Скопируйте SFMT.h в папку вашего проекта и включите его в проект.
Отредактируйте WrapSFMT.h следующим образом:
#pragma once
#include "SFMT.H"
using namespace System;
namespace WrapSFMT {
public ref class SRandom
{
public:SRandom(UInt32);
public:UInt32 Rand32(void);
};
}
Они объявляют методы, которые будут в вашем классе. Теперь отредактируйте WrapSFMT.cpp, чтобы он читался так:
#include "WrapSFMT.h"
namespace WrapSFMT {
SRandom::SRandom(UInt32 seed)
{
init_gen_rand(seed);
}
UInt32 SRandom::Rand32()
{
return gen_rand32();
}
}
Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете собрать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.
изменить на «Не использовать предварительно скомпилированные заголовки». В Linker / General / Additional Library Directories введите путь к SFMT.lib. В Linker / Input / Additional Dependencies добавьте SFMT.lib. Закройте страницы свойств. Скопируйте SFMT.h в папку вашего проекта и включите его в проект.Отредактируйте WrapSFMT.h следующим образом:
#pragma once
#include "SFMT.H"
using namespace System;
namespace WrapSFMT {
public ref class SRandom
{
public:SRandom(UInt32);
public:UInt32 Rand32(void);
};
}
Они объявляют методы, которые будут в вашем классе. Теперь отредактируйте WrapSFMT.cpp, чтобы он читался так:
#include "WrapSFMT.h"
namespace WrapSFMT {
SRandom::SRandom(UInt32 seed)
{
init_gen_rand(seed);
}
UInt32 SRandom::Rand32()
{
return gen_rand32();
}
}
Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете создать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.
изменить на «Не использовать предварительно скомпилированные заголовки». В Linker / General / Additional Library Directories введите путь к SFMT.lib. В Linker / Input / Additional Dependencies добавьте SFMT.lib. Закройте страницы свойств. Скопируйте SFMT.h в папку вашего проекта и включите его в проект.Отредактируйте WrapSFMT.h следующим образом:
#pragma once
#include "SFMT.H"
using namespace System;
namespace WrapSFMT {
public ref class SRandom
{
public:SRandom(UInt32);
public:UInt32 Rand32(void);
};
}
Они объявляют методы, которые будут в вашем классе. Теперь отредактируйте WrapSFMT.cpp, чтобы он читался так:
#include "WrapSFMT.h"
namespace WrapSFMT {
SRandom::SRandom(UInt32 seed)
{
init_gen_rand(seed);
}
UInt32 SRandom::Rand32()
{
return gen_rand32();
}
}
Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете создать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.
В Linker / General / Additional Library Directories введите путь к SFMT.lib. В Linker / Input / Additional Dependencies добавьте SFMT.lib. Закройте страницы свойств. Скопируйте SFMT.h в папку вашего проекта и включите его в проект.Отредактируйте WrapSFMT.h следующим образом:
#pragma once
#include "SFMT.H"
using namespace System;
namespace WrapSFMT {
public ref class SRandom
{
public:SRandom(UInt32);
public:UInt32 Rand32(void);
};
}
Они объявляют методы, которые будут в вашем классе. Теперь отредактируйте WrapSFMT.cpp, чтобы он читался так:
#include "WrapSFMT.h"
namespace WrapSFMT {
SRandom::SRandom(UInt32 seed)
{
init_gen_rand(seed);
}
UInt32 SRandom::Rand32()
{
return gen_rand32();
}
}
Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете собрать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.
В Linker / General / Additional Library Directories введите путь к SFMT.lib. В Linker / Input / Additional Dependencies добавьте SFMT.lib. Закройте страницы свойств. Скопируйте SFMT.h в папку вашего проекта и включите его в проект.Отредактируйте WrapSFMT.h следующим образом:
#pragma once
#include "SFMT.H"
using namespace System;
namespace WrapSFMT {
public ref class SRandom
{
public:SRandom(UInt32);
public:UInt32 Rand32(void);
};
}
Они объявляют методы, которые будут в вашем классе. Теперь отредактируйте WrapSFMT.cpp, чтобы он читался так:
#include "WrapSFMT.h"
namespace WrapSFMT {
SRandom::SRandom(UInt32 seed)
{
init_gen_rand(seed);
}
UInt32 SRandom::Rand32()
{
return gen_rand32();
}
}
Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете собрать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.
добавить SFMT.lib. Закройте страницы свойств. Скопируйте SFMT.h в папку вашего проекта и включите его в проект.Отредактируйте WrapSFMT.h следующим образом:
#pragma once
#include "SFMT.H"
using namespace System;
namespace WrapSFMT {
public ref class SRandom
{
public:SRandom(UInt32);
public:UInt32 Rand32(void);
};
}
Они объявляют методы, которые будут в вашем классе. Теперь отредактируйте WrapSFMT.cpp, чтобы он читался так:
#include "WrapSFMT.h"
namespace WrapSFMT {
SRandom::SRandom(UInt32 seed)
{
init_gen_rand(seed);
}
UInt32 SRandom::Rand32()
{
return gen_rand32();
}
}
Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете создать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.
добавить SFMT.lib. Закройте страницы свойств. Скопируйте SFMT.h в папку вашего проекта и включите его в проект.Отредактируйте WrapSFMT.h следующим образом:
#pragma once
#include "SFMT.H"
using namespace System;
namespace WrapSFMT {
public ref class SRandom
{
public:SRandom(UInt32);
public:UInt32 Rand32(void);
};
}
Они объявляют методы, которые будут в вашем классе. Теперь отредактируйте WrapSFMT.cpp, чтобы он читался так:
#include "WrapSFMT.h"
namespace WrapSFMT {
SRandom::SRandom(UInt32 seed)
{
init_gen_rand(seed);
}
UInt32 SRandom::Rand32()
{
return gen_rand32();
}
}
Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете собрать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.
#include "WrapSFMT.h"
namespace WrapSFMT {
SRandom::SRandom(UInt32 seed)
{
init_gen_rand(seed);
}
UInt32 SRandom::Rand32()
{
return gen_rand32();
}
}
Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете собрать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.
#include "WrapSFMT.h"
namespace WrapSFMT {
SRandom::SRandom(UInt32 seed)
{
init_gen_rand(seed);
}
UInt32 SRandom::Rand32()
{
return gen_rand32();
}
}
Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете создать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.
Есть ли причина, по которой вы не можете скомпилировать реализацию C в DLL и вызвать ее из своего кода C #?
EDIT:
Извините, но у меня есть только очень ограниченное знание C (и действительно C #), но "Как создать C dll" можно ответить здесь: http://www.kapilik.com/2007/09/17/how-to- create-a-simple-win32-dll-using-visual-c-2005 / и насколько быстро можно проверить с помощью профилирования кода.
Я не вижу здесь вашей проблемы со скоростью. На моей машине (Core 2 Duo T7200 @ 2 ГГц) генерация случайного целого числа с помощью MT19937 или MT19937-64 занимает около 20 нс (в среднем при отрисовке 50000 чисел). Таким образом, это будет около 4,32 × 10 12 (то есть около 4 триллионов чисел) в день. И это для одного ядра. С Java. Итак, я думаю, вы можете ожидать, что производительность будет более чем адекватной для ваших нужд.
Чтобы ответить на ваш вопрос: я не знаю о реализации SFMT на C #, но преобразование кода C в C # должно быть довольно простым . Однако от этого вы ничего не добьетесь, поскольку SFMT оптимизирован для SIMD, а C # в настоящее время не поддерживает это напрямую.
Может быть это то, что вы ищете? Существует список из нескольких реализаций.
В частности, эта (Кори Нельсон) может быть полезна.