如何使用linq从列表中的列表中选择某些字符串(按索引)
本文关键字:列表 字符串 索引 选择 linq 何使用 | 更新日期: 2023-09-27 18:17:00
我有一个看起来像这样的对象。
List<List<string>> MyData;
内部List<string>
可以包含未定义数量的字符串,但该数量始终大于0。
在另一个对象中,我有要选择的字符串的索引号。索引号位于MyObject.number中;
如何获得一个仅在给定索引处存在字符串的List<List<string>>
对象?
我尝试了以下方法:
List<List<string>> test = new List<List<string>>();
List<MyObject>.ForEach(p => test.Add(MyData.Select(q => q[p.Number]).ToList()));
这并不奏效,因为我得到了一个字符串在列表中分离的列表。
示例:
我得到了一个List
,里面有100个List<string>
。List<string>
包含5个字符串。List<MyObject>
告诉我他有索引0和2。
我尝试的代码返回给我一个列表,其中有两个列表。第一个列表包含List<string>
的0位置的所有字符串,第二个列表列出List<string>
的2位置的所有串。我想要一个有100个列表的列表,每个列表中有2个字符串。
请帮我解决这个问题。
如有需要,请随时询问更多信息。
解决方案:
List<List<string>> MyResult = MyData.Select(l => MyObjects.Select(p => p.Number).ToList().Select(i => l[i]).ToList()).ToList();
我认为这就是您想要的(索引是请求的索引的集合(
var indexes = new List<int>() {0, 2};
var whatYouWant = strings.Select(item => indexes.Select(index => item[index]).ToList())
在linq中,您可以传递两个参数,第二个参数将是带有当前元素索引号的整数。
List<string> strings = new List<string>();
strings.Where((s, i) => i == indexToLookFor).Select(s => s);
通过这种方式,您可以轻松地仅返回具有要查找的索引的项。在你的情况下,你可以使用这样的东西:
strings.Where((s, i) => indexes.Contains(i)).Select(s => s);
当然,这只是一个例子,但我相信你可以根据自己的情况进行调整。
var lists = new List<List<string>>
{
new List<string> { "1", "2", "3", "4" },
new List<string> { "5", "6", "7", "8" },
new List<string> { "9", "10", "11", "12" },
};
var indexes = new List<int> { 0, 2 };
var result = lists.Select(l => indexes.Select(i => l[i]).ToList()).ToList();
foreach (var list in result)
{
Console.Write("list:");
foreach (var elt in list)
{
Console.Write(elt + ",");
}
Console.Write(" / ");
}
输出:
list:1,3,/list:5,7,/list:9,11,/
var indexes = myObjects.Select(obj => obj.Number);
var result = test.Select(list => indexes.Select(idx => list[idx]).ToList()).ToList();
myObjects
是MyObject
实例的列表。