如何使用linq从列表中的列表中选择某些字符串(按索引)?

时间:2011-12-06 12:58:30

标签: c# linq

我有一个看起来像这样的对象。

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();

4 个答案:

答案 0 :(得分:4)

我认为这就是你想要的(索引是所请求索引的集合)

var indexes = new List<int>() {0, 2};
var whatYouWant = strings.Select(item => indexes.Select(index => item[index]).ToList())

答案 1 :(得分:2)

在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);

当然这只是一个例子,但我相信你可以调整它以适应你的情况。

答案 2 :(得分:1)

        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,/

答案 3 :(得分:0)

var indexes = myObjects.Select(obj => obj.Number);
var result = test.Select(list => indexes.Select(idx => list[idx]).ToList()).ToList();

myObjectsMyObject个实例的列表。