LINQ - BETWEEN" a"和" e"

时间:2015-10-20 05:12:54

标签: c# linq

我有一份通用的学生名单。我想在LINQ的帮助下过滤学生姓名开始between "a" and "e"

Students = Students.Where(s => s.Name.Substring(0, 1) == "a" 
                            && s.Name.Substring(0, 1) == "e").ToList();

请帮我这样做。

10 个答案:

答案 0 :(得分:5)

未经测试可能有效:

Students = Students.Where(s => s.Name.Substring(0, 1) >= "a" 
                        && s.Name.Substring(0, 1) <= "e").ToList();

可选地

Students = Students.Where(s => ["a", "b", "c", "d", "e"]
                               .contains(s.Name[0]).ToList();

答案 1 :(得分:4)

范围由less / greater定义,而不仅仅是==:

 Students = Students.Where(s => s.Name.Substring(0, 1) >= "a" 
                        && s.Name.Substring(0, 1) <= "e").ToList();

您也可能想要小写或比较两种情况。

答案 2 :(得分:4)

有多种方法可以做到这一点。这是两个:

您仍然可以使用原始代码,但将同等性检查转换为范围检查:

Students = Students.Where(s => s.Name[0] >= 'a' && s.Name[0] <= 'e');

或者,您也可以直接使用ASCII values

Students = Students.Where(s => s.Name[0] >= 97 && s.Name[0] <= 101);

请注意,我们在这里使用的是Name[0]而不是Substring,因此我们可以获得该字母的char / int值,而不是{{1} }}。

另一种方法是,如果字符不相邻,可以使用,可以创建一个列表并检查该列表中是否包含第一个字母:

string

答案 3 :(得分:4)

我会这样做,通过添加一个方法将字符转换为整数ASCII value然后可以进行比较:

private static bool StartsWithRange(string value, char first, char last)
{
  if (string.IsNullOrEmpty(value))
  {
    return false;
  }

  if (first > last)
  {
    throw new ArgumentException(string.Format("'{0}' shouldn't come after '{1}'.", first, last), nameof(last));
  }

  int intValue = value.ToLower()[0];
  return intValue >= first && intValue <= last;
}

用法:

Students.Where(s => StartsWithRange(s, 'a', 'e')).ToList();

我测试了不同的病例,似乎有效:

Assert.IsFalse(StartsWithRange("abcd", 'd', 'e'));
Assert.IsTrue(StartsWithRange("dcd", 'd', 'e'));
Assert.IsTrue(StartsWithRange("Dcd", 'd', 'e'));
Assert.IsTrue(StartsWithRange("ebcd", 'd', 'e'));
Assert.IsTrue(StartsWithRange("Ebcd", 'd', 'e'));
Assert.IsFalse(StartsWithRange("fbcd", 'd', 'e'));
Assert.IsFalse(StartsWithRange("Fbcd", 'd', 'e'));
Assert.IsFalse(StartsWithRange(string.Empty, 'd', 'e'));

请注意ToLower - 来电,如果并非所有value的情况都相同,则需要这样做。

如果值全部在一行中,如果它们只是&#34;随机&#34;字母,然后我将使用如上所述的数组方法。

答案 4 :(得分:4)

我更喜欢你使用正则表达式。

students = students.Where(x => Regex.IsMatch(x.Name, @"^[a-e].*", RegexOptions.IgnoreCase) == true).ToList();

在这里,您可以看到我使用了正则表达式@"^[a-e].*"来表示我们必须使用名称以a,b,c,d,e开头的姓名。因此,您可以轻松修改过滤器以吸引学生。

注意:请包含名称空间using System.Text.RegularExpressions;以在项目中使用正则表达式。

答案 5 :(得分:3)

我会用你提供的信息来做这件事。

var s = new [] {"a","b","c","d","e"};
Students = Students.Where(s => s.Contains(s.Name.Substring(0, 1))).ToList();

答案 6 :(得分:2)

希望我理解正确。

Students = Students.Where(s => {
   char c = s.Name[0];
   return (c >= 'a' && c <= 'e') || (c >= 'A' && c <= 'E') ;
}).ToList();

我还包括大写字母。

答案 7 :(得分:2)

在不使用其他字符串操作方法的情况下,最简单的方法之一是:

var filter = Students.Where(s => s!= null && s [0] >= 'a' && s[0] <= 'e').ToList();

答案 8 :(得分:2)

您可以使用string.CompareOrdinal方法。

Students = Students.Where(s => 
string.CompareOrdinal(s.Name.Substring(0, 1), "a") >= 0 && string.CompareOrdinal(s.Name.Substring(0, 1), "e") <= 0)
.ToList();

它将包括“a”和“e”。在比较之前,您还可以使用大写转换进行不区分大小写的比较。

答案 9 :(得分:2)

我会考虑实现一个Between扩展方法并使用它。

代码示例:

    public void Main()
    {
        var names = new string[] { "andy", "lisa", "zoro", "billy" };

        var result = FilterBetween(names, 'a', 'e');
    }

    public IEnumerable<string> FilterBetween(IEnumerable<string> names, char start, char end)
    {
        return names.
            Where(name => name.
                First().
                Between(start, end));
    }



public static class ExtensionMethods
{
    public static bool Between<T>(this T actual, T lower, T upper) where T : IComparable<T>
    {
        return actual.CompareTo(lower) >= 0 && actual.CompareTo(upper) <= 0;
    }
}