根据另一个集合对集合进行排序
问题描述:
我有一个文件名集合,其中一部分路径名是特定的单词。我可以为了这样的集合:根据另一个集合对集合进行排序
var files = from f in checkedListBox1.CheckedItems.OfType<string>()
orderby f.Substring(0,3)
select f;
但现在,我想不是的路径部分按字母顺序排列,但根据其他集合给出了具体排序。
假设路径名部分可以是“ATE”,“DET”和“RTI”。我有另一个字符串集合{{“DET”,“ATE”,“RTI”},我想用它来对文件名进行排序,以便排序后,文件名首先以“DET” ,然后是“RTI”。我如何实现这一点 - >需要使用自己的比较器?
答
三种不同的变化,这取决于如果你想使用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
方法,但你可以建立一个这里写的How to get index using LINQ?
答
这应该工作
var files = from f in checkedListBox1.CheckedItems.OfType<string>()
orderby anotherCollection.IndexOf(f.Substring(0,3))
select f;
+0
只有当'anotherColletion'是'List
答
如果您的问题与您的状态一样简单,并且只有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;
});
(http://*.com/questions/3355928/c-sharp-sort-list-based-on-another-list)基于另一个列表C#排序列表]的可能重复 – nawfal