Тип данных подходит для пары объектов List <string>, поскольку один контейнер содержит оба
Самостоятельно изучаю C#, в новом проекте, над которым я начал работать,
один из методов, принимает List<string>
Тип данных, передаваемых в качестве параметра. я хотел бы знать, сейчас... что нужны два из этих списков, два типа данных или две группы,
и просто для этого примера, скажем, у меня есть плюсы и минусы, или.. девочки и мальчики,
на самом деле это два отдельных списка элементов или объектов, которые мне нужно передать как параметр, и я хочу, чтобы он передавался как один тип данных, а затем внутри метода я позабочусь о разделении списков данных, так что.. вместо пары List
объекты я, думал (на секунду там, что Dictionary
подойдет...)
хотя у меня будет только один элемент (один элемент... каждый List
), в этом типе данных, которые мне нужно передать
Что я могу сделать, чтобы получить этот результат?
я постараюсь проиллюстрировать это:
List<string> classGirls = new List<string>();
List<string> classBoys = new List<string>();
для простого элемента в источнике... загрузить оба из источника
сделано Список девочек + список Мальчики заполнены, как бы вы назвали их одним словарём. Могли бы вы знать, что у вас будет только один объект для девочек и один для мальчиков?
public bool foundAMatch( string Lookup, List<string> G , List<string> B){
{
var firstGirl = G.ElementAt(0);
var firstBoy = B.ElementAt(0);
return firstGirl == Lookup && firstBoy !=Lookup ;
}
вместо этого мне нужно, чтобы это было что-то вроде
public bool foundAmatch(string Lookup, someDataType.... Kids)
{
var firstGirl = kids-girls <-- first entity in kids;
var firstBoy = kids-boys <-- first entity in Kids;
return firstGirl == Lookup && firstBoy !=Lookup ;
}
Имеется в виду несколько вещей... что касается свойств данных, они должны иметь хорошую производительность... естественно желаемые, хотя самое главное, они должны быть подходящими / простыми в организации и подходящими для итераций, использующих циклы для сортировки и как подлежащие любому виду статистических операций.
- вопрос в том,
как вы будете реализовывать логику, это существующий тип данных... о котором я думаю ?
если нет, то какой подход вы будете применять в этом сценарии, выбирая / создавая тип данных?
2 ответа
Вы можете легко решить эту проблему, используя наследование:
public abstract class Person
{
public string Name { get; private set; } // The setter is private because we only have to set this name when we create an instance
protected Person(string name)
{
Name = name;
}
}
public class Male : Person
{
public Male(string name) : base(name) // This constructor calls the constructor of the class it inherits and passes on the same argument
}
public class Female : Person
{
public Female(string name) : base(name)
}
public bool IsMatch(string needle, IEnumerable<Person> haystack)
{
var firstGirl = haystack.OfType<Female>().FirstOrDefault();
var firstBuy = haystack.OfType<Male>().FirstOrDefault();
return firstGirl != null &&
firstGirl.Name == needle &&
firstBoy != null &&
firstBoy.Name != needle;
}
редактировать:
Мне очень нравятся методы расширения, поэтому я бы написал такой метод:
public static class PersonExtensions
{
public static bool IsMatch(this IEnumerable<Person> haystack, string needle)
{
// same method logic in here
}
}
который вы можете использовать как:
var people = new List<Person>();
people.Add(new Male { Name = "Bob" });
people.Add(new Female { Name = "Mary" });
var isMatch = people.IsMatch("Jane");
edit2:
Возможно, даже лучше иметь пол как собственность Person
учебный класс:
public enum Sex
{
Male,
Female
}
public class Person
{
public string Name { get; private set; }
public Sex Gender { get; private set; }
public Person(string name, Sex gender)
{
Name = name;
Gender = gender;
}
}
и измените метод на:
var firstGirl = haystack.FirstOrDefault(p => p.Gender == Gender.Female);
var firstBoy = haystack.FirstOrDefault(p => p.Gender == Gender.Male);
Лучший способ получить одну коллекцию - создать класс, представляющий мальчика и девочку. Пожалуйста, найдите пример ниже:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private class Kid
{
public bool Gender { get; set; }
public String Name { get; set; }
}
private List<Kid> kids;
private void Form1_Load(object sender, EventArgs e)
{
// === Load data =================================================
kids = new List<Kid>();
kids.Add(new Kid { Name = "John", Gender = true });
kids.Add(new Kid { Name = "Paul", Gender = true });
kids.Add(new Kid { Name = "Jack", Gender = true });
kids.Add(new Kid { Name = "Brenda", Gender = false });
kids.Add(new Kid { Name = "Judith", Gender = false });
kids.Add(new Kid { Name = "Sofia", Gender = false });
Kid foundKid = foundAMatch("sofIa");
}
private Kid foundAMatch(string name)
{
var result = (from K in kids
where K.Name.ToLower() == name.ToLower()
select K);
if (result.Count() != 0)
return result.First();
else
return null;
}
private Kid foundAMatch(string name, bool gender)
{
var result = (from K in kids
where K.Name.ToLower() == name.ToLower() && K.Gender == gender
select K);
if (result.Count() != 0)
return result.First();
else
return null;
}
}
}