从List中的每个Tuple中获取特定的项
本文关键字:获取 List Tuple | 更新日期: 2023-09-27 17:53:17
创建一个列表的正确方法是什么,例如,Tuples
的List
中每个Tuple
的第一项?
如果我有一个List<Tuple<string,string>>
,我如何得到每个Tuple
的第一个字符串的List<string>
?
用一点Linq就可以了:
var myStringList = myTupleList.Select(t=>t.Item1).ToList();
作为解释,因为Tim发布了几乎相同的答案,Select()创建了一个1:1的"投影";它接受Enumerable的每个输入元素,并对每个元素求值,并将结果作为具有相同元素数量的新Enumerable的元素返回。然后ToList()将遍历Select()生成的Enumerable,并将每个元素一次一个地添加到新的List<T>
实例中。
Tim在内存效率上说得很好;ToList()将创建一个列表并每次添加一个元素,这将导致list不断调整其底层数组的大小,每次将其加倍以确保它具有适当的容量。对于一个大的列表,这可能会导致outofmemoryexception,并且它将导致CLR为列表分配比所需更多的内存,除非元素的数量恰好是2的幂。
List<string> list = tuples.Select(t => t.Item1).ToList();
或者,可能更少的内存开销:
List<string> list = new List<String>(tuples.Count);
list.AddRange(tuples.Select(t => t.Item1));
,因为它避免了ToList
中List.Add
的加倍算法。
如果您有一个List<Tuple<string, string>> listoftuples
,您可以使用List的Select方法实现从每个Tuple中获取第一个字符串。
它看起来像这样:
List<string> firstelements = listoftuples.Select(t => t.Item1).ToList();
泛化变体:用于选择集合元组长度未知的特定项,即2,3,4…:
static IEnumerable TupleListSelectQuery<T>(IEnumerable<T> lst, int index) where T : IStructuralEquatable, IStructuralComparable, IComparable
{
return lst.Select(t => typeof(T).GetProperty("Item" + Convert.ToString(itemNumber)).GetValue(t)).ToList();
}
其中index的值对应于元组的枚举方式,即1,2,3…(不为0、1、2…)。