LINQ按姓氏选择订单范围

时间:2010-06-29 15:18:20

标签: c# linq-to-objects

我想回想起来这可能是显而易见的,但我发现我很难理解这一点。

基本上我只想使用LINQ to Objects从一系列具有姓氏属性的对象中进行选择,这两个姓氏之间的姓氏按字母顺序排列,例如在列表中:

Adams
Bentham
Bickford
Gillies
Kelly
Moore
Peters
Rutherford
Smith
Taylor
Williams

如果您从“Kelly”中选择“Smith”,它将返回:

Kelly
Moore
Peters
Rutherford
Smith

以下。

它必须足够具体,以至于一个人选择Kelly to Smith并且之前有一个Kellerman和一个Smythe之后查询会将这些留下来,所以LIKE'K%'和LIKE'S%'是不好。此外,你必须通过k和s之间的所有字母才能到达那里。

我可能只是愚蠢地将问题提交给谷歌,但似乎没有其他人有这种字母关注。希望有人可以提供帮助。

编辑:到目前为止,这么好的人。但这是一个脑力劳动者。我们想要设置返回的最大记录数。

例如,如果我们要求Bickford给Rutheerford最多3个,我们应该回来:

Bickford
Gillies
Kelly

目前我们只是随机获得球门柱之间的三个名字。

有什么想法吗?

5 个答案:

答案 0 :(得分:3)

我认为你正在寻找类似的东西

static IEnumerable<string> GetNames(IEnumerable<string> originalList, string fromName, string toName)
{
    foreach (string name in originalList)
    {
        if (name.CompareTo(fromName) >= 0 && name.CompareTo(toName) <= 0)
            yield return name;
    }
}

或LINQ版

static IEnumerable<string> GetNames(IEnumerable<string> originalList, string fromName, string toName)
{
    var query = from name in originalList
                where name.CompareTo(fromName) >= 0 && name.CompareTo(toName) <= 0
                select name;

    return query;
}

用于生成Kelly to Smith包含列表的示例用法

string[] surnames = { "Adams", "Bentham", "Bickford", "Gillies", "Kelly", "Moore", "Peters", "Rutherford", "Smith", "Taylor", "Williams" };

foreach (string name in GetNames(surnames, "Kelly", "Smith"))
    Console.WriteLine(name);

答案 1 :(得分:1)

怎么样:

var results = Users
    .OrderBy(x => x.Surname)
    .SkipWhile(x => x.Surname.CompareTo("Kelly") < 0)
    .TakeWhile(x => x.Surname.CompareTo("Smith") <= 0);

答案 2 :(得分:0)

我认为应该这样做:

var Names = SourceList.OrderBy(x => x.SurName).Select(x => x.SurName >= "Kelly")
            .Select(x => x.SurName <= "Smith").ToList();

我可能错了。这一切还是新的。

答案 3 :(得分:0)

这样的东西
names
    .Where(n => n.surname.CompareTo(fromName) >= 0)
    .Where(n => n.surname.CompateTo(toName) <= 0)

答案 4 :(得分:0)

    public IEnumerable<UserListItem> GetFilteredUsers(String start, String end)
    {
        var Users = from u in User.GetUsers()
                    let firstLetter = Char.ToUpper(u.FirstName[0])
                    let startLetter = Char.ToUpper(start[0])
                    let endLetter = Char.ToUpper(end[0])
                    where firstLetter >= startLetter && firstLetter <= endLetter
                    orderby u.FirstName
                    select u;
    }