C#:如何根据主列表</string>从两个List <string>中获取运行组合

时间:2010-12-20 17:44:21

标签: c# linq

亲爱的,这就像我之前的问题How to get moving combination from two List<String> in C#?

我有一个主列表和两个子列表,如下所示

        List<String> MasterList = new List<string> { "A", "B", "C", "D", "E" };
        List<String> ListOne = new List<string> { "A", "B", "C" };
        List<String> ListTwo = new List<String> { "B", "D" };

我只需要从上面的列表中获取正在使用的运行组合(上一个问题的答案(谢谢Danny Chen))

        List<String> Result = new List<string>();
        Result = ListOne.SelectMany((a, indexA) => ListTwo
                                    .Where((b, indexB) => ListTwo
                                    .Contains(a) ? !b.Equals(a) && indexB > indexA : 
                                    !b.Equals(a)).Select(b => string.Format("{0}-{1}", a, b))).ToList(); 

所以结果列表将包含

        "A-B"
        "A-D"
        "B-D"
        "C-B"
        "C-D"

现在我的问题是排序问题

在上面的结果中,第四个条目是C-B但它应该是B-C。因为MasterList C位于B之后。

如何在我现有的linq中执行此操作。

请帮我这样做。

1 个答案:

答案 0 :(得分:1)

这里的确切要求并不是很清楚,MasterList也决定首先出现哪两项? X1-X2列表的顺序怎么样?即B-C应该出现在B-D之前,因为C出现在MasterList中的D之前?

无论如何,这是产生你到目前为止所要求的结果的东西:

List<String> MasterList = new List<string> { "A", "B", "C", "D", "E" };
List<String> ListOne = new List<string> { "A", "B", "C" };
List<String> ListTwo = new List<String> { "B", "D" };

ListOne.SelectMany(i => 
ListTwo.Where(i2 => i != i2)
       .Select(i2 => 
            {
                if (MasterList.IndexOf(i) < MasterList.IndexOf(i2))
                    return string.Format("{0}-{1}", i, i2);
                else
                    return string.Format("{0}-{1}", i2, i);
            }
       ));

输出:

A-B
A-D
B-D
B-C
C-D