在C#中给出以下两个列表:
List<string> X = new List<string>({ "a", "b", "c", "d", "e", "f", "g", "h", "i"});
List<float> Y = new List<float> ({ 0.991f, 1.471f, 3.819f, 0.003f, 2.291f, 2.887f, 2.887f, 0, 1.0f});
使用Y中的浮点值对X进行排序的最干净/最短的方法是什么,以获得以下输出?
"h", "d", "a", "i", "b", "e", "f", "g", "c"
具有相同浮动“键”的元素的顺序无关紧要。
答案 0 :(得分:4)
如果每个字符串键都是唯一的,并且每个列表都完全匹配,则可以使用System.Reactive中的zip将它们用作字典中的键。
var dic = X.Zip(Y, (k, v) => new { k, v })
.ToDictionary(x => x.k, x => x.v);
现在,按值对新构建的字典进行排序。
var sortedDict = from entry in dic orderby entry.Value ascending select entry;
在&#34;单线&#34;使用查询语法,这变为:
var dic = X.Zip(Y, (k, v) => new { k, v })
.ToDictionary(x => x.k, x => x.v);
.OrderBy(x => x.Value);
答案 1 :(得分:1)
这是一种方式:
IEnumerable<string> sorted = X
.Select((value, index) => new { Index = index, Value = value })
.OrderBy(o => Y[o.Index])
.Select(o => o.Value);
基本上:
.Select
将列表(X
)投影到一个新的匿名对象序列中,该序列包含X
中的字符串及其在列表中的索引。Y
。Value
部分,以创建仅包含string
中X
的新序列。答案 2 :(得分:0)
以下代码遵循气泡分类技术......
for(int i = 1; i < max; i++)
{
for(int j = 0; j < max - i; j++)
{
if(Y[j] > Y[j + 1])
{
int temp = X[j];
X[j] = X[j + 1];
X[j + 1] = temp;
int temp1 = Y[j];
Y[j] = Y[j + 1];
Y[j + 1] = temp1;
}
}
}