如果我有char* (*loadDex) (char * dexPath, char * odexPath,int flag) = NULL;
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
char* (*loadDex) (char *, char *,int) = NULL;
LOGD("JNI_OnLoad!");
void *ldvm = (void*) dlopen("/system/lib/libdvm.so", RTLD_LAZY);
if(ldvm == NULL)
{
LOGD("ERROR : %s",dlerror());
//is art
void *ldvm = (void*) dlopen("/system/lib/libart.so", RTLD_LAZY);
}
loadDex = (char* (*) (char *, char *,int)) dlsym (ldvm, "loadDex");
void *venv;
if ((*vm)->GetEnv(vm, (void**) &venv, JNI_VERSION_1_4) != JNI_OK)
{
return -1;
}
return JNI_VERSION_1_4;
}
,我可以使用例如
List<T>
如果我有myList.Sort((x,y) => x.MyComparisonMethod(y));
,我可以使用
IList<T>
如何对var sortedIList = unsortedIList.OrderBy(x => x.SortingValue);
进行排序?
我正在使用C#.NET 4.5.1。
答案 0 :(得分:0)
使用ArrayList.Adapter作为IList<T>
包装器编写您自己的扩展方法,并从某个Comparison代理开始编写您自己的CustomComparer
:
public static class IListExtensions
{
public static void Sort<T>(this IList<T> list, Comparison<T> comparison)
{
ArrayList.Adapter((IList)list).Sort(new CustomComparer<T>(comparison));
}
}
答案 1 :(得分:-1)
“我可以使用” no将其排序到新列表中,但事实并非如此,OrderBy
不会返回列表,您必须调用ToList
来创建新名单。您的问题是如何将List.Sort
与IList<T>
而不是List<T>
一起使用?
您可以为IList<T>
编写扩展方法:
public static IList<T> Sort<T>(this IEnumerable<T> sequence, IComparer<T> comparer = null)
{
var seqList = sequence as List<T>;
if (seqList != null)
{
seqList.Sort((IComparer<T>)comparer);
return seqList;
}
var seqArray = sequence as T[];
if (seqArray != null)
{
Array.Sort(seqArray, (IComparer<T>)comparer);
return seqArray;
}
return sequence.OrderBy(t => t, (IComparer<T>)comparer).ToList();
}
现在,您可以在列表,数组或任何其他类型的序列上使用Sort
:
IList<string> strings = new[] { "B", "A", "C" };
strings.Sort();
更新:如果您只想要一个阵列或列表,您可以使用:
public static void Sort<T>(this IList<T> sequence, IComparer<T> comparer = null)
{
var seqList = sequence as List<T>;
if (seqList != null)
{
seqList.Sort((IComparer<T>)comparer);
return;
}
var seqArray = sequence as T[];
if (seqArray != null)
{
Array.Sort(seqArray, (IComparer<T>)comparer);
}
}
答案 2 :(得分:-2)
我怀疑你指的是你的OrderBy
不会编译的事实。这是因为它返回IOrderedEnumerable
,而不是IList
,之后您必须执行ToList()
才能将其转换为IList
实现:
var sortedIList = unsortedIList.OrderBy(x => x.SortingValue).ToList();
如果您想使用自己的IComparer
:
var sortedIList = unsortedIList.OrderBy(x => x.SortingValue, new MyComparer()).ToList();