使用Lambda / Linq获取集合中按字母顺序排列的项目列表?

时间:2010-01-21 20:36:13

标签: c# linq lambda

我有一个对象列表。每个对象都包含一个名为“DisplayName”的属性。

我想创建另一个字符串对象列表,其中每个字符串代表初始列表中所有对象的DisplayName属性中的第一个字母或字符(可能是数字),我希望列表是不同的。< / p>

因此,例如,如果我的列表包含以下三个对象:

(1)DisplayName ='Anthony' (2)DisplayName ='Dennis' (3)DisplayName ='John'

我想创建另一个包含以下三个字符串的列表:

(1)'A' (2)'D' (3)'J'

任何想法如何使用lambda表达式或linq进行最少编码?

3 个答案:

答案 0 :(得分:3)

像这样:

list.Select(o => o.DisplayName[0].ToString())
    .Where(s => Char.IsLetter(s, 0))
    .Distinct().ToList();

被修改

答案 1 :(得分:1)

List<myObject> mylist = new List<myObject>();
//populate list
List<string> myStringList = myList
    .Select(x => x.DisplayName.Substring(0,1))
    .Distinct()
    .OrderBy(y => y);

在上面的代码中,Select(使用它的lambda)只返回对象x的显示名称中的第一个字符。这会创建IEnumerable类型string,然后传递给Distinct()。这可确保您在列表中只有唯一的项目。最后,OrderBy确保您的商品按字母顺序排序。

注意,如果列表中的每个对象属于不同类型,您将无法只调用x.DisplayName。在这种情况下,我会创建一个可能称为IDisplayName的接口,它实现DisplayName。然后你应该能够在你的lambda中使用x => ((IDisplayName)x).DisplayName.Substring(0,1)

答案 2 :(得分:0)

或查询表示法:

var stringList = (from a in objectList 
                      select a.DisplayName.Substring(0,1)).Distinct();