从列表中的每个元组中获取特定项目

时间:2013-01-15 20:14:55

标签: c# string list tuples

Tuple List的{​​{1}}中创建每个Tuples的第一项列表的正确方法是什么?

如果我有List<Tuple<string,string>>,我如何获得List<string>中第一个字符串的Tuple

4 个答案:

答案 0 :(得分:22)

一点点Linq会做到这一点:

var myStringList = myTupleList.Select(t=>t.Item1).ToList();

作为解释,由于Tim发布了几乎相同的答案,Select()会创建一个1:1的“投影”;它接受Enumerable的每个输入元素,并且对于它们中的每一个,它计算lambda表达式并将结果作为具有相同元素数量的新Enumerable的元素返回。然后,ToList()将遍历Select()生成的Enumerable,并将每个元素一次添加到新的List<T>实例。

蒂姆对记忆效率有一个很好的观点; ToList()将创建一个列表并一次添加一个元素,这将导致List继续调整其底层数组的大小,每次加倍以确保它具有适当的容量。对于一个大的列表,这可能会导致OutOfMemoryExceptions,并且它将导致CLR为List分配比所需更多的内存,除非元素的数量恰好是2的幂。

答案 1 :(得分:5)

List<string> list = tuples.Select(t => t.Item1).ToList();

或者,可能更少的内存昂贵:

List<string> list = new List<String>(tuples.Count);
list.AddRange(tuples.Select(t => t.Item1));

因为它避免了List.AddToList的倍增算法。

答案 2 :(得分:0)

如果您有List<Tuple<string, string>> listoftuples,则可以使用List的Select方法实现从每个元组中获取第一个字符串。

看起来像这样:

List<string> firstelements = listoftuples.Select(t => t.Item1).ToList();

答案 3 :(得分:0)

Generialised Variant: 用于选择集合的元组长度未知的特定项目,即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 ......)。