如何比较两个列表,如果它们具有相等的值,则取列表的两个索引

时间:2020-02-19 13:21:54

标签: c# list for-loop

您将如何比较两个列表,并说如果这两个列表具有相等的值,则获取两个不同点的索引,并从该索引处的两个不同列表中吐出另外两个列表值。两个列表具有相等的值,应该比较的两个列表中都包含ID,其他两个应该写出值的列表中都包含categoryNames。我的代码看起来像这样...

document/raw:/storage/emulated/0/Download/Question_Bank/26_9_day_CSE_summer_final_2018_Wireless Programming.pdf (No such file or directory)

TestCode

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Office.Interop.Excel;

namespace PrestaConverter
{
    public class ExcellCreation
    {
        #region privata variabler

        /// <summary>
        /// WhatExcelFile Håller reda på Vilken excelfil som ska sparas, 
        /// Name Namnet på sparfilen,
        /// count är en räknare som ger id till Kategorierna
        /// </summary>
        Hashtable myHashtable = new Hashtable();
        private int WhatExcellFile;
        private string name = "CategoriesCatalog";
        private List<string> ColumnNames = new List<string>() {"ID",
            "Active(0/1)",
            "Name*",
            "Parent Category",
            "Root Category(0/1)",
            "Description",
            "Meta title",
            "Meta keywords",
            "Meta description",
            "URL rewritten",
            "Image URL"
        };
        private Categories categories1 = new Categories();
        private Categories categories2 = new Categories();
        private Categories categories3 = new Categories();
        private int count;
        ExcelConverter converter = new ExcelConverter(); 

        #endregion

        #region Skapa excel

        /// <summary>
        /// Funktion som skapar de nya Excelfilerna 
        /// </summary>
        /// <param name="excelValue">Kategorinamnen sänds över till denna funktion för upplägg i ny fil</param>
        /// <param name="rowAmmount">Används till att få tag på hur många rader som ska existera i excel filen</param>
        /// <returns></returns>
        public string CreateExcel(List<Categories> categories)
        {
            Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();

            if (xlApp == null)
            {
                return "Excel är inte korrekt installerat";
            }

            Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
            Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
            object misValue = System.Reflection.Missing.Value;

            xlWorkBook = xlApp.Workbooks.Add(misValue);
            xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            categories1 = categories[0];
            categories2 = categories[1];
            categories3 = categories[2];

            for(int i = 0; i < categories1.CategoryId.Count; i++)
            {
                if(categories1.NewCategoryId.Contains(categories1.CategoryId[i]) == false && categories1.CategoryId[i].Substring(3,4) == "0000")
                {
                    categories1.NewCategoryId.Add(categories1.CategoryId[i]);
                    categories1.NewCategoryName.Add(categories1.CategoryName[i]);
                }
            }
            Console.WriteLine(categories1.NewCategoryId.Count); 
            for(int i = 0; i < ColumnNames.Count; i++)
            {
                xlWorkSheet.Cells[1, i + 1].Value2 = ColumnNames[i];
            }
            for(int i = 0; i < categories1.NewCategoryId.Count; i++)
            {
                xlWorkSheet.Cells[2 + i , 3].Value2 = categories1.NewCategoryName[i];
                xlWorkSheet.Cells[2 + i, 4].Value2 = "Home";
            }
            for(int i = 0; i < categories2.CategoryId.Count; i++)
            {
                if(categories2.NewCategoryId.Contains(categories2.CategoryId[i]) == false && categories2.CategoryId[i].Substring(5, 2) == "00")
                {
                    categories2.NewCategoryId.Add(categories2.CategoryId[i]);
                    categories2.NewCategoryName.Add(categories2.CategoryName[i]);
                }
            }

            Console.WriteLine(categories2.NewCategoryName.Count); 
            for(int i = 0; i < categories1.NewCategoryId.Count; i++)
            {
                for(int j = 0; j < categories2.NewCategoryId.Count; j++)
                {
                    if(categories1.NewCategoryId[i].Substring(0,3) == categories2.NewCategoryId[j].Substring(0, 3))
                    {
                        categories2.parentCategoryId.Add(categories1.NewCategoryId[i]);
                        categories2.parentCategoryName.Add(categories1.NewCategoryName[i]);
                    } 
                }
            }
            for(int i = 0; i < categories2.parentCategoryId.Count; i++)
            {
                xlWorkSheet.Cells[categories1.NewCategoryId.Count + i, 4].Value2 = categories2.parentCategoryName[i]; 
            }
            for(int i = 0; i < categories2.NewCategoryName.Count; i++)
            {
                xlWorkSheet.Cells[categories1.NewCategoryId.Count + i, 3].Value2 = categories2.NewCategoryName[i];
            }

            //Here saving the file in xlsx
            xlWorkBook.SaveAs(@"C:\Users\Jens Svensson\Documents\" + name + ".xlsx", Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook, misValue,
                misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);

            xlWorkBook.Close(true);
            xlApp.Quit();

            return "Funkar";
        }

        #endregion

        private string createId(string Id, int start, int end)
        {
            return Id.Substring(start, end);
        }
    }
}

这是我想得到的结果,但我只是让他们陷入混乱,所以该怎么做?

3 个答案:

答案 0 :(得分:0)

我对您的问题不太了解。 我查看了您的代码,这似乎很合理。

如果您愿意,可以看看LinQ,尤其是WhereDistinct扩展名方法。

我希望我有用。

答案 1 :(得分:0)

您可以使用.Intersect()检索匹配的元素,然后使用.IndexOf()获取索引。最后,访问其他列表的索引值。

var list1 = new List<int> { 1, 2, 3, 4, 5 };
var list2 = new List<int> { 4, 5, 6, 7, 8 };

var intersectingValues = list1.Intersect(list2); // 4, 5
var interesectingValueIndexes = intersectingValues.Select(x => 
                                   new { I1 = list1.IndexOf(x), I2 = list2.IndexOf(x) });

var otherList1 = new List<string> { "a", "b", "c", "d", "e" };
var otherList2 = new List<string> { "f", "g", "h", "i", "j" };

var otherListIndexValues = interesectingValueIndexes.Select(x => 
                                   new { V1 = otherList1[x.I1], V2 = otherList2[x.I2] });

答案 2 :(得分:0)

您可以从一个列表中创建一个Dictionary<T, int[]>,例如从list2中创建一个

using System.Linq;

...

var list1 = ...
var list2 = ... 

var dict = list2
  .Select((value, index) => new {value, index})     
  .GroupBy(pair => pair.value, pair => pair.index)
  .ToDictionary(group => group.Key, group => group.ToArray());

现在,借助dict.TryGetValue,您可以获得在int[]中出现所需值的所有list2索引,例如

foreach (var item in list1) {
  if (dict.TryGetValue(item, out int[] indexes)) {
    // item appears in list2 at indexes
    Console.WriteLine($"value {item} appears at [{string.Join(", ", indexes)}]");
  }
  else {
    // item is not found in list2 
  }
}

演示:

var list1 = new List<string>() {"A", "B", "C", "D", "E"};
var list2 = new List<string>() {"A", "B", "A", "A", "C", "B", "D"};

var dict = list2
  .Select((value, index) => new {value, index})     
  .GroupBy(pair => pair.value, pair => pair.index)
  .ToDictionary(group => group.Key, group => group.ToArray());

for (int i = 0; i < list1.Count; ++i) {
  var item = list1[i];

  if (dict.TryGetValue(item, out int[] indexes))
    Console.WriteLine(
      $"value {item} at {index} appears in list2 at [{string.Join(", ", indexes)}]");
  else 
    Console.WriteLine($"value {item} at {index} doesn't appear in list2");
}

结果:

value A at 0 appears in list2 at [0, 2, 3]
value B at 1 appears in list2 at [1, 5]
value C at 2 appears in list2 at [4]
value D at 3 appears in list2 at [6]
value E at 4 doesn't appear in list2
相关问题