C# 在C语言中基于另一个浮点列表的排序列表
在C中给出以下两个列表:C# 在C语言中基于另一个浮点列表的排序列表,c#,linq,sorting,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}); 具有
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});
具有相同浮点键的元素的顺序并不重要。这里有一种方法:
IEnumerable<string> sorted = X
.Select((value, index) => new { Index = index, Value = value })
.OrderBy(o => Y[o.Index])
.Select(o => o.Value);
基本上:
用于将列表X投影到一个新的匿名对象序列中,该序列包含来自X的字符串及其在列表中的索引。
按Y中的对应值。
选择匿名对象的值部分以创建一个新序列,该序列仅包含X中的字符串。
示例:如果每个字符串键都是唯一的,并且每个列表都完全匹配,则可以使用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;
在使用查询语法的单行程序中,这将变成:
var dic = X.Zip(Y, (k, v) => new { k, v })
.ToDictionary(x => x.k, x => x.v);
.OrderBy(x => x.Value);
下面的代码遵循气泡排序技术
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;
}
}
}
非常整洁,非常优雅。
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;
}
}
}