Linq query - find strings based upon first letter

2019-05-07 12:56发布

We have a list containing names of countries. We need to find names of countries from list b/w two letters. Like names of all countries with name starting b/w A-G and so on. We create following linq query but its ugly.

var countryAG = from elements in countryList
where elements.StartsWith("A") || 
elements.StartsWith("B") || 
elements.StartsWith("C") || 
elements.StartsWith("D") || 
elements.StartsWith("E") || 
elements.StartsWith("F") || 
elements.StartsWith("G") || 
elements.StartsWith("H") 
select elements;

where countryList is created in C#

List< string> countryList = new List< string>();

Any help or any other efficient way to accomplish above task?

标签: c# linq letters
6条回答
孤傲高冷的网名
2楼-- · 2019-05-07 13:44

Try

char[] startingLetters = new char[] {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};
var countryAG = 
    from elements in countryList 
    where elements.IndexOfAny(startingLetters, 0, 1) == 0 
    select elements;

See here for information on IndexOfAny.

查看更多
【Aperson】
3楼-- · 2019-05-07 13:45

I can't test it right now, but I would try

countryList.Where((s) => s[0] <= 'A' && s[0] >= 'G');
查看更多
Luminary・发光体
4楼-- · 2019-05-07 13:54

I have two extension functions:

public static IEnumerable<char> Range(char start, char end)
{
  return Enumerable.Range((int)start, (int)end - (int)start + 1).Select(i => (char)i);
}

which creates a range of characters, and

public static bool In(this string source, IEnumerable<string> collection)
{
  return collection.Contains(source);
}

which is just the inverse of Contains, mostly for readability.

Together I can do:

where elements[0].In(Range('a', 'f')))

查看更多
干净又极端
5楼-- · 2019-05-07 13:55

Try use this code:

var start = "a";
var end = "g";
var regex = new Regex(string.Format("^[{0}-{1}]", start, end));
var result = list.Where(x => regex.Match(x.ToLowerInvariant()).Success);

'start' and 'end' are static as an example.

查看更多
老娘就宠你
6楼-- · 2019-05-07 13:58

You could use a prefix list and then use the prefix list for comparison - this way you can easily use different prefix lists based on what range you are interested in:

 List<string> prefixList = new List<string>() { "A", "B", "C", "D", "E", "F", "G" };
 var countryAG = countryList.Where( x=> prefixList.Any( p => x.StartsWith(p)));
查看更多
贼婆χ
7楼-- · 2019-05-07 14:02
var countryAG = from elements in countryList
                where elements[0] >= 'A' && elements[0] <= 'H'
                select elements;

Chars are just numbers really, thus you can compare them as such

查看更多
登录 后发表回答