从List中的每个Tuple中获取特定的项

本文关键字:获取 List Tuple | 更新日期: 2023-09-27 17:53:17

创建一个列表的正确方法是什么,例如,TuplesList中每个Tuple的第一项?

如果我有一个List<Tuple<string,string>>,我如何得到每个Tuple的第一个字符串的List<string> ?

从List中的每个Tuple中获取特定的项

用一点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));

,因为它避免了ToListList.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…)。

相关文章: