.net 按特定字符串对对象集合排序C# LINQ

qxgroojn  于 2023-02-17  发布在  .NET
关注(0)|答案(2)|浏览(144)

我正在调用由第三方提供的雇员搜索API,它将返回雇员列表作为搜索结果。(例如,名字、姓氏、地址、移动的号码等)。我想将这些搜索结果的“名字”属性与搜索文本进行比较。如果匹配,我希望这些匹配结果排在集合的顶部。到目前为止,我已经尝试使用IComparer和IComparable,但它们都不适合我的要求。下面分享我的要求的一个例子:
示例:我在API中搜索“John”,API提供了10个结果。在这10个结果中,只有1个结果的名字是john,其余9个结果的其他属性中也有john。我需要名字为“John”的员工作为第一个结果。

bqjvbblv

bqjvbblv1#

您可以通过以下方式对列表进行排序

var sorted = resultFromApi.OrderByDescending(x => x.FirstName == "John").ToList();

新列表将包含所有FirstName开头为“John”的条目,以及所有FirstName结尾为其他值的条目。

sq1bmfud

sq1bmfud2#

我试过使用IComparer和IComparable,但它们都不适合我的要求。
您完全可以利用IComparer来实现这一点:

public class BumpToFirstComparer : IComparer<string>
{
    private readonly string valueToBump;

    public BumpToFirstComparer(string valueToBump)
    {
        this.valueToBump = valueToBump;
    }

    int IComparer<string>.Compare(string? x, string? y)
    {
        if (x == this.valueToBump) return -1;
        if (y == this.valueToBump) return 1;

        return 0;
    }
}

注意我们是怎么说的“每个元素都是相同的,除了我想处理的这个特例:如果这个特例在比较中被发现是第一个,我们总是说它应该在第二个之前,如果它被发现是第二个,那么第二个总是在第一个。
然后你可以把它传递给任何一个升序排序方法,它应该会给予你想要的结果:

IEnumerable<string> GetInput()
{
    yield return "Juliano";
    yield return "SomeoneElse";
    yield return "John";
    yield return "YetAnotherPerson";
}

foreach (var ordered in GetInput().Order(new BumpToFirstComparer("John")))
{
    Console.WriteLine(ordered);
}

这产生:
约翰
胡利亚诺
其他人
还有其他人
John现在位于顶部,而列表的其余部分保持不变。

相关问题