好吧,我可能会在这里讨论一些事情。 我尝试按另一个列表对List进行排序。只要另一个List包含List的所有元素,它就可以正常工作。 如果另一个List不完整且我想将其余元素保留在List的末尾,那么什么是好的评价?
这里有一个例子:
public class Column
{
public int Id;
public string Name;
public string Something;
//...
}
public class Columns : IEnumerable<Column>
{
private List<Column> columnList = new List<Column>;
public void SortByName(List<Column> sortedIncompleteList)
{
var sorted = from incomplete in sortedIncompleteList
join current in columnList
on incomplete.FieldName equals current.FieldName
select current;
columnList = sorted.ToList();
}
//...
}
答案 0 :(得分:1)
也许我过度简化它,但如果你想排序,为什么不使用OrderBy
?您可以使用以下逻辑首先获取两个集合中的项目:
public void SortByName(List<Column> sortedIncompleteList)
{
columnList = columnList
.OrderByDescending(c => sortedIncompleteList.Any(c2 => c.FieldName == c2.FieldName))
.ToList();
}
根据评论更新:&#34;但不按实际出现在sortedIncompleteList
&#34;中的顺序排列:
public void SortByName(List<Column> sortedIncompleteList)
{
columnList = columnList
.OrderBy(c => {
int index = sortedIncompleteList.FindIndex(c2 => c.FieldName == c2.FieldName);
if (index == -1) return int.MaxValue;
return index;
})
.ToList();
}
答案 1 :(得分:0)
我认为列表中的元素是唯一的,因为Column
有一个Id
字段,因为我的解决方案会删除重复项。
public class Columns : IEnumerable<Column>
{
private List<Column> columnList = new List<Column>;
public void SortByName(List<Column> sortedIncompleteList)
{
columnList = sortedIncompleteList.Intersect(columnList)
.Concat(columnList.Except(sortedIncompleteList)).ToList();
}
//...
}
Intersect()
,Concat()
和Except()
将保留订购...
答案 2 :(得分:0)
您可以使用以下内容:
var ids = sortedIncompleteList.Select(li => li.Id).ToList();
var ordered = from element in columnList
let index = ids.IndexOf(element.Id)
orderby index < 0 ? columnList.Count : index
select element;