Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据另一个集合对集合进行排序_C#_Linq - Fatal编程技术网

C# 根据另一个集合对集合进行排序

C# 根据另一个集合对集合进行排序,c#,linq,C#,Linq,我有一组文件名,其中一部分路径名是一个特定的单词。我可以这样订购该系列: var files = from f in checkedListBox1.CheckedItems.OfType<string>() orderby f.Substring(0,3) select f; var files=来自checkedListBox1.CheckedItems.OfType()中的f orderby f.Substring(0,3) 选

我有一组文件名,其中一部分路径名是一个特定的单词。我可以这样订购该系列:

var files = from f in checkedListBox1.CheckedItems.OfType<string>()
            orderby f.Substring(0,3)
            select f;
var files=来自checkedListBox1.CheckedItems.OfType()中的f
orderby f.Substring(0,3)
选择f;
但是现在,我不想按路径名部分的字母顺序排序,而是根据另一个集合给出的特定顺序排序

假设路径名部分可以是“ATE”、“DET”和“RTI”。我还有另一个字符串集合:{“DET”、“ATE”、“RTI”},我想用它对文件名进行排序,这样在排序之后,文件名和它们的部件名的顺序是先“DET”,然后是“ATE”,然后是“RTI”。如何实现这一点->需要使用自己的比较器吗?

这应该可以

var files = from f in checkedListBox1.CheckedItems.OfType<string>()
        orderby anotherCollection.IndexOf(f.Substring(0,3))
        select f;
var files=来自checkedListBox1.CheckedItems.OfType()中的f
orderby anotherCollection.IndexOf(f.Substring(0,3))
选择f;

三种不同的变体,具体取决于您是否要使用
字符串[]
列表
字典(仅当您有许多元素要搜索时才适用)

string[]collection=new[]{“DET”、“ATE”、“RTI”};
var files=来自checkedListBox1.CheckedItems.OfType()中的f
orderby Array.IndexOf(集合,f.Substring(0,3))
选择f;
列表集合2=新列表{“DET”、“ATE”、“RTI”};
var files2=来自checkedListBox1.CheckedItems.OfType()中的f
orderbycollection2.IndexOf(f.Substring(0,3))
选择f;
Dictionary collection3=新词典
{{“DET”,1},{“ATE”,2},{“RTI”,3};
Func getIndex=p=>
{
国际关系;
if(集合3.TryGetValue(p,out res))
{
返回res;
}
返回-1;
};
var files3=来自checkedListBox1.CheckedItems.OfType()中的f
orderbygetindex(f.Substring(0,3))
选择f;

我要补充的是,LINQ没有一个“generic”
IndexOf
方法,但是如果您的问题像您所说的那样简单,并且只有3个可能的前缀,那么您可以按照这里所写的方法构建一个

var fileNames = checkedListBox1.CheckedItems.OfType<string>();
var files = fileNames.OrderBy(f => 
{
    int value = int.MaxValue;
    switch (f.Substring(0, 3))
    {
        case "DET":
            value = 1;
            break;
        case "ATE":
            value = 2;
            break;
        case "RTI":
            value = 3;
            break;
    }
    return vakue;
});
var fileNames=checkedListBox1.CheckedItems.OfType();
var files=文件名.OrderBy(f=>
{
int value=int.MaxValue;
开关(f.子串(0,3))
{
案件“DET”:
数值=1;
打破
案例“ATE”:
数值=2;
打破
案例“RTI”:
数值=3;
打破
}
返回瓦库;
});

仅当
另一个集合
列表
:-)(或具有
IndexOf
实例方法的某个其他集合类型。例如,数组没有它)的可能重复项
var fileNames = checkedListBox1.CheckedItems.OfType<string>();
var files = fileNames.OrderBy(f => 
{
    int value = int.MaxValue;
    switch (f.Substring(0, 3))
    {
        case "DET":
            value = 1;
            break;
        case "ATE":
            value = 2;
            break;
        case "RTI":
            value = 3;
            break;
    }
    return vakue;
});