创建一个列表的正确方法是什么,比如Tuple
a List
of中每个的第一项Tuples
?
如果我有一个List<Tuple<string,string>>
,我将如何获得List<string>
每个字符串中的第一个字符串Tuple
?
一点 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 的幂。
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.Add
in的加倍算法ToList
。
如果您有List<Tuple<string, string>> listoftuples
,您可以使用 List 的 Select 方法实现从每个元组中获取第一个字符串。
它看起来像这样:
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 ...)。