17

创建一个列表的正确方法是什么,比如Tuplea Listof中每个的第一项Tuples

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

4

4 回答 4

24

一点 Linq 就可以解决问题:

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

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

Tim 对内存效率有很好的看法。ToList() 将创建一个列表并一次添加一个元素,这将导致 List 不断调整其底层数组的大小,每次将其加倍以确保其具有适当的容量。对于一个大列表,这可能会导致 OutOfMemoryExceptions,并且它将导致 CLR 为列表分配比必要更多的内存,除非元素的数量恰好是 2 的幂。

于 2013-01-15T20:15:57.197 回答
6
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.Addin的加倍算法ToList

于 2013-01-15T20:15:43.673 回答
0

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

它看起来像这样:

List<string> firstelements = listoftuples.Select(t => t.Item1).ToList();
于 2013-01-15T20:17:41.880 回答
0

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

于 2017-10-31T15:58:24.680 回答