LINQ - 由另一个集合订购

时间:2018-03-02 12:24:34

标签: c# linq sorting collections

我有一个元素集合:

public class CompanyVistracksDomain
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int VistracksAccountId { get; set; }
}    

和另一个元素集合:

public class VistrackAccountInfoDomain
{
    public int Id { get; set; }
    public string Name { get; set; }                
}

所以,我有:

List<CompanyVistracksDomain> companies =
    await _companyService.CompanyListHasVistracksIdAsync();

List<VistrackAccountInfoDomain> accList =
    await _vistracksService.GetAllAccountsAsync(companies);

他们有类似的元素列表。 第一个序列包含第二个序列中出现的所有元素。第一个序列已排序。如何按第一顺序排序第二个集合?

3 个答案:

答案 0 :(得分:2)

OP的评论表明第二个集合是第一个集合的正确子集。在这种情况下,您可以简单地将第一个集合与第二个集合相交。这将有效地返回第二个集合的元素,但它们出现在第一个集合中的顺序:

List<CompanyVistracksDomain> companies =
    await _companyService.CompanyListHasVistracksIdAsync();


List<VistrackAccountInfoDomain> accList =
    await _vistracksService.GetAllAccountsAsync(companies);

List<VistrackAccountInfoDomain> sorted = 
    companies.Intersect(accList);

如果VistrackAccountInfoDomain不是来自CompanyVistrackDomain,那么您必须手动模仿Intersect行为:

public IEnumerable<VistrackAccountInfoDomain> Intersect(
    CompanyVistracksDomain first,
    VistrackAccountInfoDomain second)
{
    Set<int> set = new Set<int>();
    Dictionary<int, VistrackAccountInfoDomain> content = 
        new Dictionary<int, VistrackAccountInfoDomain>();

    foreach (TSource element in second)
    {
        set.Add(element);
        content[element.Id] = element;
    }

    foreach (TSource element in first)
        if (set.Remove(element.Id)) 
            yield return content[element.Id];    
}

此实现假设至少有一些方法可以匹配两个序列的元素,例如某些Id属性。

答案 1 :(得分:1)

假设他们的ID对于每个条目都是唯一的,您可以尝试这个(无法自我测试):

var idList = companies.Select(y => y.ID).ToList();
var result = accList
    .OrderBy(x => idList.IndexOf(x.Id))
    .ToList();

答案 2 :(得分:-3)

using System.Linq;

IEnumerable<CompanyVistracksDomain> companies = new List<CompanyVistracksDomain>();
IEnumerable<VistrackAccountInfoDomain> accList = new List<VistrackAccountInfoDomain>();

companies = companies.OrderBy(o => o.Name );
accList = accList.OrderBy(o => o.Name );