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();