2016-11-08 49 views
5

我有一个对象列表,每个对象都有属性total如何从对象列表中创建一个不同的整数列表?

我需要从上面的列表中创建一个新的List<int>。问题是如果两个对象有total = 4,List<int>应该只包含一个'4'。

让我的名单是:

[ 
    {name: "vishnu" , total: 10}, 
    {name: "vishnu2", total: 11}, 
    {name: "vishnu3", total: 15}, 
    {name: "vishnu4", total: 10} 
] 

所以在我的整数列表输出应该是:

10,11,15

,而不是:

10,11,15,10

+4

请你添加代码 – fubo

回答

10

使用LINQ:

myObjects.Select(obj => obj.total).Distinct().ToList() 
+6

注为未来:与“'”包装代码使一个代码块(一个句子中的内联很有用),但在启动四个空格(或按下Ctrl - K同时突出代码)提供了一个更好的块语法突出显示 – Rob

+0

解决方案是相同的 –

+0

@MongZhu它是三分钟前。虽然许多人认为SO只有质量问题,但还有一个巨大的时间因素,使第一个答案成为最受关注的问题。 – HimBromBeere

1

您可以使用这样的事情:

var result = myInput.GroupBy(x => x.Total).Select(x => new 
{ 
    Total = x.Key, 
    Name = x.First().Name 
}); 

这将创建匿名类型的新列表,其中每一个元素都有ToalName - 属性。然而,如果多于一个在一起,那么只有一个小组的第一个元素被考虑。

该解决方案的优点是可以保留Name-属性。如果你不需要这个,只对Total感兴趣,那么其他人建议的Distinct更容易。

1

这样子吗?

using System.Linq; 
... 

var list = new List <YourClass>(); 
... 
var newList = list.Select(i => i.total).Distinct().ToList(); 
4

你为什么要存储在List<T>不同项目?这似乎是一个错误的集合类型。我建议使用HashSet<T>经过特殊专为

https://msdn.microsoft.com/en-us/library/bb359438(v=vs.110).aspx

的实现可以简单到

HashSet<int> result = new HashSet<int>(list.Select(item => item.total)); 

测试

// 10, 11, 15 
Console.Write(String.Join(", ", result)); 

如果你坚持List<int>

List<int> myList = result.ToList(); 
+0

我想显示一个下拉总数no.s,所以列表int是足够ryt? –

+0

@hilda sonica:只显示不同的数字'myComboBox.Items.AddRange(list.Select(item => item.total).Distinct()。Select(item =>(object)item).ToArray()); ';显示项目的数量:'myComboBox.Items.AddRange(list.GroupBy(item => item.total).Select(chunk => $“{chunk.Key}:{chunk.Count()} items(s )“)ToArray的());' –

相关问题