簡體   English   中英

根據另一個集合對集合進行排序

[英]Sort a collection based on another collection

我有一個文件名集合,其中一部分路徑名是一個特定的單詞。 我可以點這樣的集合:

var files = from f in checkedListBox1.CheckedItems.OfType<string>()
            orderby f.Substring(0,3)
            select 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;

三種不同的變體,取決於您是否要使用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;
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM