Как получить опору ключа объекта в словаре C #? - PullRequest
0 голосов
/ 28 ноября 2011

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

У меня есть beers словарь с .Но у метода есть только имя объекта Beer (prop), а не объект.

И у меня нет другой идеи, как я могу получить имя объекта Beer из словаря

У меня есть только 2 идеи, но они не работают.

Во-первых, я попытался использовать метод ContainsKey ().Вторая итерация foreach

using System;
using System.Collections.Generic;

namespace PubBeer
{
    public class Beer
    {
        string name;
        int price; 
        double alcohol;


        public string Name{ get { return name; } }

        public int Price{ get; set; }

        public double Alcohol{ get { return alcohol;} }

        public Sör(string name, int price, double alcohol)
        {
            this.name= name;
            this.price= price;
            this.alcohol= alcohol;
        }


        public override bool Equals(object obj)
        {
            if (obj is Beer)
            {
                Beer other = (Beer)obj;
                return this.name== other.name;
            }
            return false;
        }
    }

    public class Pub
    {

        int income;

        IDictionary<Beer, int> beers= new Dictionary<Beer, int>();


        public int Income{ get; set; }


        public int Sold(string beerName, int mug)
        {
           // Here the problem

            beers; // Here I want to like this: beers.Contains(beerName)
                  //  beers.ContainsKey(Object.Name==beerName) or someone like this 

           // foreach (var item in beers)
           // {
           //     item.Key.Name== beerName;
           //  }


        }
...

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Используйте LINQ для запроса набора ключей.

//Throws an error if none or more than one object has the same name.
var beer = beers.Keys.Single(b => b.Name == beerName);

beers[beer] = ...;

// -or -

//Selects the first of many objects that have the same name.
//Exception if there aren't any matches.
var beer = beers.Keys.First(b => b.Name == beerName);

beers[beer] = ...;

// -or -

//Selects the first or default of many objects.
var beer = beers.Keys.FirstOrDefault(b => b.Name == beerName);

//You'll need to null check
if (beer != null)
{
    beers[beer] = ...;
}

// etc...

Обновление: NON-LINQ Альтернатива

Beer myBeer;

foreach (var beer in beers.Keys)
{
    if (beer.Name == beerName)
    {
        myBeer = beer;
        break;
    }
}

if (myBeer != null)
{
    beers[myBeer] = ...;
}
1 голос
/ 28 ноября 2011

Вы можете использовать Any() в коллекции ключей:

if (beers.Keys.Any(x => x.Name == beerName))
{
}

В худшем случае это должно было бы просмотреть все виды пива - если вы обычно просматриваете пиво по имени, вам следует рассмотреть вопрос о том, чтобы назвать название пива ключом, а сам объект пива - значением в словаре.

Как только вы определили, что такое пиво существует, вы можете использовать First(), чтобы выбрать его:

 Beer myBeer = beers.First(x => x.Key.Name == beerName).Key;
0 голосов
/ 28 ноября 2011

попробуйте использовать свойство Keys

beers.Keys.Where(p => p.name == beername ) 

или

beers.Keys.FirstOrDefault(p => p.name == beername)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...