基于另一个集合对一个集合进行排序

本文关键字:集合 一个 排序 另一个 | 更新日期: 2023-09-27 18:11:19

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

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

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

那么假设路径名部分可以是"ATE","DET"answers"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;

三个不同的变体,取决于您是否想使用string[], List<string>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;

我将补充说,LINQ没有一个"通用"的IndexOf方法,但你可以构建一个写在这里如何使用LINQ获得索引?

如果你的问题像你所说的那么简单,并且只有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;
});