LINQ - 另一个集合的订单[关闭]

问题描述 投票:-1回答:3

我有一个元素集合:

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

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

c# linq sorting collections
3个回答
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
投票

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

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

-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 );
© www.soinside.com 2019 - 2024. All rights reserved.