C# 根据另一个列表对列表进行排序';s值
我有两个列表:C# 根据另一个列表对列表进行排序';s值,c#,C#,我有两个列表:finalAnswers和draftAnswers,其中finalAnswers[I]与draftAnswers[I]相关,它们的大小相同 我想对finalAnswers进行排序,使元素I++,具有draftAnswers[I].ID=0显示在顶部,然后是其他 假设finalAnswers是: finalAnswers[1].Name = "a"; finalAnswers[2].Name = "b"; finalAnswers[3].Name = "c"; finalAnswe
finalAnswers
和draftAnswers
,其中finalAnswers[I]
与draftAnswers[I]
相关,它们的大小相同
我想对finalAnswers
进行排序,使元素I++
,具有draftAnswers[I].ID=0
显示在顶部,然后是其他
假设finalAnswers是:
finalAnswers[1].Name = "a";
finalAnswers[2].Name = "b";
finalAnswers[3].Name = "c";
finalAnswers[1].Name = "a";
finalAnswers[2].Name = "c";
finalAnswers[3].Name = "b";
以及draftAnswers中的相应元素:
draftAnswers[1].ID = 1;
draftAnswers[2].ID = 0;
draftAnswers[3].ID = 2;
一旦分类,最终服务是:
finalAnswers[1].Name = "a";
finalAnswers[2].Name = "b";
finalAnswers[3].Name = "c";
finalAnswers[1].Name = "a";
finalAnswers[2].Name = "c";
finalAnswers[3].Name = "b";
我尝试使用通常的orderBy
,但在这种情况下并不简单。欢迎提出任何建议
更新:
类别:
价值观:
var finalAnswers = new List<A>() { new A() { id = 7, tID = 10, cID = 50, Name="Q1" },
new A() { id = 8, tID = 20, cID = 30, Name="Q2" },
new A() { id = 9, tID = 30, cID = 20, Name="Q3" }
};
var draftAnswers = new List<A>() { new A() { id = 1, tID = 10, cID = 50, Name="Q5" },
new A() { id = 0, tID = 20, cID = 30, Name="Q2" },
new A() { id = 1, tID = 30, cID = 20, Name="Q3" }
};
输出(最终用户ID):
预期:
7
9
8
orderBy
没有按acsending顺序排序-因此,您正在使用以下行对finalAnswers
列表进行排序:1
它做了它应该做的,除了它有两个问题:
- 它没有考虑以下条件:
draftAnswers[i].id=0
- 您是通过属性值进行匹配的,而不是像原始需求那样通过索引进行匹配的
.id==0的项目的方法更改draftAnswers
列表的排序方式:
draftAnswers = draftAnswers.OrderBy(d => d.id == 0).ThenBy(d => d.id).ToList();
finalAnswers = finalAnswers.OrderBy(b => draftAnswers.FindIndex(a => a.tID == b.tID &&
a.cID == b.cID)).ToList();
然而,我认为你没有理由继续使用两个单独的列表。您只需将它们合并到一个列表
,其中键
s是您的draftAnswers
项,值
s是finalAnswers
项。然后您可以使用与上面相同的方法使用ThenBy()
,以便根据您拥有的两个条件对列表进行排序
类似于以下内容的内容可以很好地工作:
var mixed = new List<KeyValuePair<A, A>>()
{ new KeyValuePair<A, A>(new A() { id = 1, tID = 10, cID = 50, Name = "Q5" }, // draft.
new A() { id = 7, tID = 10, cID = 50, Name = "Q1" }), // final.
new KeyValuePair<A, A>(new A() { id = 0, tID = 20, cID = 30, Name = "Q2" }, // draft.
new A() { id = 8, tID = 20, cID = 30, Name = "Q2" }), // final.
new KeyValuePair<A, A>(new A() { id = 1, tID = 10, cID = 50, Name = "Q5" }, // etc.
new A() { id = 9, tID = 30, cID = 20, Name = "Q3" })};
mixed = mixed.OrderBy(a => a.Key.id == 0).ThenBy(a => a.Key.id).ToList();
Console.WriteLine("finalAnswers IDs:");
// Print the IDs of the values (finalAnswers).
foreach (var item in mixed)
Console.WriteLine(item.Value.id);
Console.WriteLine("\ndraftAnswers IDs:");
// Print the IDs of the keys (draftAnswers).
foreach (var item in mixed)
Console.WriteLine(item.Key.id);
var mixed=新列表finalAnswers.FindIndex..
而不是。。b=>draftAnswers.FindIndex..
这会产生完全不同的结果。我只是想澄清一下,这样就不会让其他人感到困惑了 在您的评论中,您提到,OrderBy
应该生成一个顺序:1,1,0
,但是这将是OrderByDescending
OrderBy
是升序,因此它对它们进行排序0,1,1
。但无论您以何种方式对draftAnswers
进行排序,结果将是(使用TId
):20,10,30
,或相反,30,10,20
。请注意,在使用“排序依据”时,如果两个条目的值相同,则它们的相对位置保持不变。这就是为什么你会有这样的结果
因此,仅在id
字段上排序并不能得到预期的结果。获得该结果的一种方法(如果这是您想要的),是使用ThenBy
对cID
字段进行进一步排序:
draftAnswers = draftAnswers
.OrderByDescending(d => d.id)
.ThenByDescending(d => d.cID)
.ToList();
finalAnswers = finalAnswers
.OrderBy(b => draftAnswers.FindIndex(a => a.tID == b.tID && a.cID == b.cID))
.ToList();
你不应该要求别人从头开始为你做这件事,而应该发布你最好的OrderBy
尝试,以显示你的努力。finalAnswers也有ID字段吗?如果不是,那么你就没有做到这一点。如果它们代表单个参与者的最终和草稿版本,为什么它们是并行数组呢?一个列表
可以简化排序并将密切相关的数据放在一起。您可以选择并行显示它们,但数据仍然可以存储在一个对象中。数组finalAnswers
和draftAnswers
中的每个元素看起来是什么样的?它们是相同的,还是不同的?另外,如何使用ID
对finalAnswers
中的项目进行排序?您所显示的预期结果并不明显。是的,这是一个输入错误(感谢您的提醒)。问题是,我想单独保存列表,而不是将它们作为键值对(@JCaptain如果您想单独保存它们,可以忽略以“但是,我看不出您有理由继续使用两个单独的列表”开头的部分只要使用上面那一段的代码,如果你对那部分有任何问题或者它不能解决你的问题,请告诉我。
var mixed = new List<KeyValuePair<A, A>>()
{ new KeyValuePair<A, A>(new A() { id = 1, tID = 10, cID = 50, Name = "Q5" }, // draft.
new A() { id = 7, tID = 10, cID = 50, Name = "Q1" }), // final.
new KeyValuePair<A, A>(new A() { id = 0, tID = 20, cID = 30, Name = "Q2" }, // draft.
new A() { id = 8, tID = 20, cID = 30, Name = "Q2" }), // final.
new KeyValuePair<A, A>(new A() { id = 1, tID = 10, cID = 50, Name = "Q5" }, // etc.
new A() { id = 9, tID = 30, cID = 20, Name = "Q3" })};
mixed = mixed.OrderBy(a => a.Key.id == 0).ThenBy(a => a.Key.id).ToList();
Console.WriteLine("finalAnswers IDs:");
// Print the IDs of the values (finalAnswers).
foreach (var item in mixed)
Console.WriteLine(item.Value.id);
Console.WriteLine("\ndraftAnswers IDs:");
// Print the IDs of the keys (draftAnswers).
foreach (var item in mixed)
Console.WriteLine(item.Key.id);
draftAnswers = draftAnswers
.OrderByDescending(d => d.id)
.ThenByDescending(d => d.cID)
.ToList();
finalAnswers = finalAnswers
.OrderBy(b => draftAnswers.FindIndex(a => a.tID == b.tID && a.cID == b.cID))
.ToList();