Проверка списка для пользовательского объекта - PullRequest
1 голос
/ 27 апреля 2020

если вы создали список пользовательских объектов, это обязательно нужно делать с хэш-кодами, если вы хотите проверить этот список, чтобы увидеть, содержит ли он объект перед его добавлением, я имею в виду, чтобы вы не получили дубликаты в списке или есть более простой способ, я просто хочу использовать метод contains в пользовательском списке объектов, чтобы увидеть, существует ли объект, который я хочу добавить, уже в списке, и если есть тогда более простой способ, чем иметь дело с хэш-кодами? это мой код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DataConverter.Objects;

namespace DataConverter.Converters
{
    class CategoryConverter
    {
        private Category category;
        private SubCategory subCategory;
        private ExcellObj excellObj; 



        public CategoryConverter(string path)
        {
            excellObj = new ExcellObj(path); 
        }

        public List<Category> getCategoryListExcel()
        {
            List<Category> categories = new List<Category>();

            List<string> ColumnNames = new List<string> { "Group1", "Group1Descr" };
            List<int> CorrectColumn = new List<int>(); 


            for(int i = 0; i < ColumnNames.Count; i++)
            {
                CorrectColumn.Add(excellObj.findColumn(ColumnNames[i]));
            }


            for(int i = 2; i < excellObj.allRows; i++)
            {   



                    categories.Add(category = new Category(excellObj.getValuesFromCell(i, CorrectColumn[1]), excellObj.getValuesFromCell(i, CorrectColumn[0]), "Home"));


            }








            return categories; 


        }
        public List<List<SubCategory>> getSubCategory()
        {
            List<SubCategory> subCategories1 = new List<SubCategory>();
            List<SubCategory> subCategories2 = new List<SubCategory>();
            List<List<SubCategory>> subCategoriesList = new List<List<SubCategory>>(); 
            List<string> ColumnNamesSubCategory1 = new List<string> { "Group2", "Group2Descr" };
            List<string> ColumnNamesSubCategory2 = new List<string> { "Group3", "Group3Desc" };
            List<int> CorrectColumn1 = new List<int>();
            List<int> CorrectColumn2 = new List<int>();


            for(int i = 0; i < ColumnNamesSubCategory1.Count; i++)
            {
                CorrectColumn1.Add(excellObj.findColumn(ColumnNamesSubCategory1[i]));
                CorrectColumn2.Add(excellObj.findColumn(ColumnNamesSubCategory2[i]));
            }

            for(int i = 1; i < excellObj.allRows; i++)
            {
                subCategories1.Add(subCategory = new SubCategory(excellObj.getValuesFromCell(i, CorrectColumn1[1]),excellObj.getValuesFromCell(i,CorrectColumn1[0]), "Home"));
                subCategories2.Add(subCategory = new SubCategory(excellObj.getValuesFromCell(i,CorrectColumn2[1]), excellObj.getValuesFromCell(i,CorrectColumn2[0]), "Home"));
            }

            subCategoriesList.Add(subCategories1);
            subCategoriesList.Add(subCategories2);


            return subCategoriesList;
        }

        public void finnishedUsingExcel()
        {
            excellObj.CloseApplication();
        }

    }
}

, и что я хочу сделать, это то, что я хочу запустить

if(categories.Contains(category) == false){
    categories.add(category)
}

Я не понимаю эту часть в документации?

   public Person(string lastName, string ssn)
   {
      if (Regex.IsMatch(ssn, @"\d{9}"))
        uniqueSsn = $"{ssn.Substring(0, 3)}-{ssn.Substring(3, 2)}-{ssn.Substring(5, 4)}";
      else if (Regex.IsMatch(ssn, @"\d{3}-\d{2}-\d{4}"))
         uniqueSsn = ssn;
      else
         throw new FormatException("The social security number has an invalid format.");

      this.LastName = lastName;
   }

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Предполагая, что у вас есть такой код:

List<CustomObject> listOfCustomObjects = new List<CustomObject>();

Решение 1

Если это так, вы можете использовать listOfCustomObjects.Contains(customObject), чтобы узнать, есть ли customObject в listOfCustomObjects. Вы должны добавить using System.Linq; в начало вашего кода, чтобы использовать этот метод.

Решение 2

Еще один способ не иметь дубликаты в вашем списке - это, по сути, не использовать List , Вы можете использовать HashSet вместо этого. При использовании этого метода дублирующиеся объекты не будут автоматически добавляться в ваш список. HashSet также находится в библиотеке LINQ, поэтому вы должны добавить строку using System.Linq; и для этого решения. Вот пример того, как создать новый HashSet с вашим классом CustomObject:

HashSet<CustomObject> setOfCustomObjects = new HashSet<CustomObject>();
0 голосов
/ 27 апреля 2020

Вам действительно нужно, чтобы ваш класс реализовывал IEquatable, если это разумно, и вы собираетесь проверять равенство с любой частотой, просто чтобы он вас не кусал. Метод «Содержит» будет работать, но только для проверки того, что присутствует точный тот же экземпляр, не обязательно тот, который просто разделяет совпадающие свойства. Рассмотрим следующий код:

class Program
    {
        static void Main(string[] args)
        {
            var classInstance = new MySampleClass("testA", "testB");

            var classList = new List<MySampleClass>();
            classList.Add(classInstance);

            if (classList.Contains(new MySampleClass("testA", "testB")))
            {
                Console.WriteLine("true");
            }
            else
            {
                Console.WriteLine("false");
            }

            if (classList.Contains(classInstance))
            {
                Console.WriteLine("true");
            }
            else
            {
                Console.WriteLine("false");
            }
        }
    }

    public class MySampleClass
    {
        public string SampleProperty1 { get; set; }
        public string SampleProperty2 { get; set; }

        public MySampleClass(string sampleProperty1, string sampleProperty2)
        {
            SampleProperty1 = sampleProperty1;
            SampleProperty2 = sampleProperty2;
        }
    }

Несмотря на то, что мы проверяем наличие класса, который имеет те же значения, что и ранее добавленный, они все еще являются отдельными экземплярами, и вы закончите с дубликатами в вашем списке.

Альтернативой в очень ограниченном случае может быть использование метода LINQ для проверки, содержит ли список уже запись со свойством, которое может сравниваться, например, int ID или что-то еще:

 yourList.Any(item => item.Id.Equals(otherItem.Id));

Опять же, если его больше, чем один, реализуйте его правильно с помощью IEquatable. См. Документация Microsoft

...