对IList <t>进行排序

时间:2015-06-19 09:45:12

标签: c# .net list ilist in-place

如果我有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。

3 个答案:

答案 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.SortIList<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();