基于C#中的另一个浮点列表对列表进行排序

时间:2015-01-21 02:40:06

标签: c# linq sorting

在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"

具有相同浮动“键”的元素的顺序无关紧要。

3 个答案:

答案 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中的字符串及其在列表中的索引。
  • Order the sequence乘以Y
  • 中的相应值
  • 选择匿名对象的Value部分,以创建仅包含stringX的新序列。

示例: https://dotnetfiddle.net/ZjZvBR

答案 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;
        }
    }
}