我有一个对象列表。每个对象都包含一个名为“DisplayName”的属性。
我想创建另一个字符串对象列表,其中每个字符串代表初始列表中所有对象的DisplayName属性中的第一个字母或字符(可能是数字),我希望列表是不同的。< / p>
因此,例如,如果我的列表包含以下三个对象:
(1)DisplayName ='Anthony' (2)DisplayName ='Dennis' (3)DisplayName ='John'
我想创建另一个包含以下三个字符串的列表:
(1)'A' (2)'D' (3)'J'
任何想法如何使用lambda表达式或linq进行最少编码?
答案 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();