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

use*_*479 5 c# linq

我有一个文件名集合,其中一部分路径名是一个特定的单词.我可以点这样的集合:

var files = from f in checkedListBox1.CheckedItems.OfType<string>()
            orderby f.Substring(0,3)
            select f;
Run Code Online (Sandbox Code Playgroud)

但是现在,我想在路径名部分按字母顺序排序,而是根据另一个集合给出的特定顺序排序.

所以我们说路径名部分可以是"ATE","DET"和"RTI".我有另一个字符串集合:{"DET","ATE","RTI"}我想用来对文件名进行排序,以便在排序后,文件名首先显示其部分名称为"DET",然后是"ATE" ,然后"RTI".我如何实现这一点 - >需要使用自己的比较器?

小智 6

这应该工作

var files = from f in checkedListBox1.CheckedItems.OfType<string>()
        orderby anotherCollection.IndexOf(f.Substring(0,3))
        select f;
Run Code Online (Sandbox Code Playgroud)


xan*_*tos 2

三种不同的变体,具体取决于您是否要使用string[],List<string>或 a Dictionary<string, int>(仅当您有许多元素要搜索时才有效)

string[] collection = new[] { "DET", "ATE", "RTI" };
var files = from f in checkedListBox1.CheckedItems.OfType<string>()
            orderby Array.IndexOf(collection, f.Substring(0, 3))
            select f;

List<string> collection2 = new List<string> { "DET", "ATE", "RTI" };
var files2 = from f in checkedListBox1.CheckedItems.OfType<string>()
            orderby collection2.IndexOf(f.Substring(0, 3))
            select f;

Dictionary<string, int> collection3 = new Dictionary<string, int> 
            { { "DET", 1 }, { "ATE", 2 }, { "RTI", 3 } };

Func<string, int> getIndex = p =>
{
    int res;
    if (collection3.TryGetValue(p, out res))
    {
        return res;
    }
    return -1;
};

var files3 = from f in checkedListBox1.CheckedItems.OfType<string>()
                orderby getIndex(f.Substring(0, 3))
                select f;
Run Code Online (Sandbox Code Playgroud)

我要补充一点,LINQ 没有“通用”IndexOf方法,但您可以按照此处编写的方式构建一个方法如何使用 LINQ 获取索引?