我有一个没有重复数据的列表。以本例为例,假设我的列表如下:
List<string> list1 = new List<string>() { "A", "B", "C", "D" };
我希望对列表中的每个项目执行操作,与列表中的其他项目进行比较,但不包括已经执行过操作的项目(A-B和B-A),或者它们是相同的项目(A-A)。
例如:
A against B
A against C
A against D
B against C
B against D
C against D
现在,这个操作非常简单,但是我的列表非常庞大,这个过程可能会非常耗时。另外,根据我拥有的数据,如果操作已经完成或者没有匹配的数据需要运行该操作,则不需要再次运行该操作。
A against A - Skip
A against B - Good
A against C - Good
A against D - Good
B against A - Skip (we already did A against B)
B against B - Skip
B against C - Good
B against D - Good
C against A - Skip
等等以此类推。
我一直在寻找一个简单的方法来完成这个操作,但我不知道是否存在这样的方法,而不是启动两个循环并执行我的操作,并保存结果以供以后比较。
遍历列表的时间复杂度为O(n*n)
,但由于我不需要比较一半以上的结果,所以这是浪费时间的,因为我知道我只需要检查O(n*(n/2))
我目前正在使用的代码如下:
List<string> list1 = new List<string>() { "A", "B", "C", "D" };
List<string> list2 = new List<string>(list1);
List<string> listResult = new List<string>();
list2.Reverse();
int i = 0;
foreach (var a in list1)
{
for (int j = 0; j < (list2.Count / 2); j++)
{
i++;
Console.WriteLine("Looped {0} times", i);
// Don't run against ourself
if (a == list2[j])
continue;
if (listResult.Count(x => (x == a + list2[j]) || (x == list2[j] + a)) == 0)
{
listResult.Add(a + list2[j]);
// Perform some operation here
// operation(a, list2[j]);
}
}
}
上述代码运行良好(我需要调整list2.Count / 2部分以适应奇数个列表)。
有更好的方法吗?我错过了什么LINQ扩展方法吗?我的问题是我真的不知道该搜索什么。
我想知道是否有一种方法可以返回仅包含我想要的项目的列表,然后我会循环遍历并执行我的操作。也许使用.SelectMany()
之类的东西。
A B A C D
? - BJ Myerslist1
中是否有重复项? - ASh