Comparing each element with each other element in a list

扶醉桌前 提交于 2020-01-02 02:26:07

问题


What is the best way to write a control structure that will iterate through each 2-element combination in a list?

Example:

{0,1,2}

I want to have a block of code run three times, once on each of these:

{0,1}
{1,2}
{0,2}

I tried the following

foreach (int i in input)
{
    foreach (int j in input.Where(o => o != i))
    {
        //Execute code
    }
}

However, this won't work when a list has two of the same elements. With

{0,2,0}

I would still want to compare elements 0 and 0. The value is irrelevant.


回答1:


It sounds like you might want something like:

for (int i = 0; i < list.Count - 1; i++)
{
    for (int j = i + 1; j < list.Count; j++)
    {
        // Use list[i] and list[j]
    }
}

You definitely can do this with LINQ:

var pairs = from i in Enumerable.Range(0, list.Count - 1)
            from j in Enumerable.Range(i + 1, list.Count - i)
            select Tuple.Create(list[i], list[j]);

I'm not sure it's any clearer though...

EDIT: Another alternative which is less efficient, but potentially clearer:

var pairs = from i in Enumerable.Range(0, list.Count - 1)
            let x = list[i]
            from y in list.Skip(i + 1)
            select Tuple.Create(x, y);


来源:https://stackoverflow.com/questions/17031771/comparing-each-element-with-each-other-element-in-a-list

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!