简体   繁体   English

按公共元素匹配和加入列表

[英]Matching and Joining Lists by common elements

The Situation is: I have a huge number of lists with a fixed size of 3 elements, for a group of four of those lists, there will be 4 unique elements that make up these lists.情况是:我有大量固定大小为 3 个元素的列表,对于一组四个列表,将有 4 个独特元素构成这些列表。 Example:例子:

Elements = [Object A, Object B, Object C, Object D, Object E, Object F, Object G, Object H]
Lists:
List 1 = {A,B,C}
List 2 = {B,C,D}
List 3 = {C,D,A}
List 4 = {D,A,B}
List 5 = {E,F,G}
List 6 = {F,G,H}
List 7 = {G,H,E}
List 8 = {H,E,F}

So, in this example elements [A, B, C, D] made four lists of three elements per list.因此,在此示例中,元素 [A, B, C, D] 构成了四个列表,每个列表包含三个元素。 Here comes the question: how can I match these four lists to get a single list that Contains [A, B, C, D]问题来了:如何匹配这四个列表以获得包含 [A, B, C, D] 的单个列表

Edit: The Actual problem is: I have a list of 2D Lines, and I want to know every 4 lines that make a rectangle.编辑:实际问题是:我有一个二维线列表,我想知道构成矩形的每 4 条线。 I started with intersecting the lines, and I got a group of lists, each list contains a line that intersects with 2 more lines.我从交叉线开始,得到一组列表,每个列表包含一条与另外 2 条线相交的线。 Now the goal is to join these lists that have the four edges of the Rectangle.现在的目标是连接这些具有矩形四个边的列表。

Using modular arithmetic and sum will work.使用模块化算术和求和将起作用。 If you divide the index of the item by 4 and sum the 3 values you will be able to group by this number.如果您将项目的索引除以 4 并将 3 个值相加,您将能够按此数字进行分组。

    class Program
    {
 
        static void Main(string[] args)
        {
            List<string> Elements = new List<string>() {"A","B","C","D","E","F","G","H"};
            MyClass[][] lists = {
                                  new MyClass[] {new MyClass() { name = "A", value = 0},new MyClass() { name = "B", value = 0},new MyClass() { name = "C", value = 0}},
                                  new MyClass[] {new MyClass() { name = "B", value = 0},new MyClass() { name = "C", value = 0},new MyClass() { name = "D", value = 0}},
                                  new MyClass[] {new MyClass() { name = "C", value = 0},new MyClass() { name = "D", value = 0},new MyClass() { name = "A", value = 0}},
                                  new MyClass[] {new MyClass() { name = "D", value = 0},new MyClass() { name = "A", value = 0},new MyClass() { name = "B", value = 0}},
                                  new MyClass[] {new MyClass() { name = "E", value = 0},new MyClass() { name = "F", value = 0},new MyClass() { name = "G", value = 0}},
                                  new MyClass[] {new MyClass() { name = "F", value = 0},new MyClass() { name = "G", value = 0},new MyClass() { name = "H", value = 0}},
                                  new MyClass[] {new MyClass() { name = "G", value = 0},new MyClass() { name = "H", value = 0},new MyClass() { name = "E", value = 0}},
                                  new MyClass[] {new MyClass() { name = "H", value = 0},new MyClass() { name = "E", value = 0},new MyClass() { name = "F", value = 0}},
                              };

            var results = lists.Select(x => new { sum = (x.Select(y => Elements.IndexOf(y.name)/4).Sum()), values = x })
                .GroupBy(x => x.sum)
                .ToList();
        }
    }
    public class MyClass
    {
        public string name { get; set; }
        public int value { get; set; }
    }

I think your best bet would be to make use of a hashset :我认为你最好的选择是使用哈希集

HashSet<Letter> uniqueValues = new HashSet<Letter>();

Letter A = new Letter() { Name = "A" } ;
Letter B = new Letter() { Name = "B" };
Letter C = new Letter() { Name = "C" };
Letter D = new Letter() { Name = "D" };

Letter[] list1 = new Letter[] { A, B, C };
Letter[] list2 = new Letter[] { B, C, D };
Letter[] list3 = new Letter[] { C, D, A };
Letter[] list4 = new Letter[] { D, A, B };

var lists = new Letter[][] { list1, list2, list3, list4 };

foreach (var list in lists)
{
    foreach (var letter in list)
    {
        uniqueValues.Add(letter);
    }
}

Debug.WriteLine(string.Join(", ", uniqueValues));  //  A, B, C, D

Hashsets specifically don't record duplicate values, so no matter how many times you add the letter A to your hashset, it'll only appear once.哈希集特别不记录重复值,因此无论您将字母 A 添加到哈希集中多少次,它都只会出现一次。 That seems to be exactly what you're looking for.这似乎正是你要找的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM