当前位置:  开发笔记 > 编程语言 > 正文

如何在C#中传递任意数量的参数

如何解决《如何在C#中传递任意数量的参数》经验,为你挑选了3个好方法。

好的,我需要设计一种方法来跟踪每个项目的存在量.大约有26个项目.我还需要一种方法来确定是否存在某些项目组合.

例如,这是纸牌游戏的引擎.每张卡都有不同的类型,每张卡都可以附加卡.需要将卡片附加到卡片上以便玩家在游戏中做某些事情.为了简化这个程序,我想做点什么

if (meetsCrit(2, water, 4, ground))
{
    do this()
}
else
{
    displayerror()
}

编辑:解决了!

我使用了下面几篇文章中描述的技术组合.特别提到:

Jon Skeet,Rinat Abdullin,Frank,

无论如何这里是我做的我创建了一个名为pair的类,它存储我正在寻找的类型,以及该类型的数量.然后我使用Predicate Delegate查找所有类型并计算有多少,然后我将它与我搜索的数字进行比较并分别返回true或false.

这是它的代码

public bool meetsCrit(params Pair[] specs)
{
    foreach (Pair i in specs)
    {
        if (!(attached.FindAll(delegate(Card c) { return c.type == i.type; }).Count >= i.value))
        {
            return false;
        }

    }
    return true;
}

Otávio Décio.. 23

使用参数:

PARAMS关键字可以指定一个方法参数,它接受一个说法,其中参数的数目是可变的.

在方法声明中的params关键字之后不允许使用其他参数,并且在方法声明中只允许一个params关键字...

调用者不会显式创建数组,但我认为这个调用仍然是*使用*数组是公平的. (2认同)


Igor Zelaya.. 14

使用params关键字传递可变数量的参数:

   private static void HowMayItems(params T[] values) {
        foreach (T val in values) { 
            //Query how many items here..
        }
    }

你也可以创建一个谓词并传递一个参数过滤器.在该方法中,您可以返回所有结果的并集.像这样的东西:

public class Item { 
    public string Name { get; set; }
}
public class ItemFilter {
    public string Name { get; set; }
    public ItemFilter(string name) {
        Name = name;
    }
    public bool FilterByName(Item i) {
        return i.Name.Equals(Name);
    }
}

public class ItemsTest {
    private static List HowMayItems(List l,params ItemFilter[] values)
    {
        List results= new List();
        foreach(ItemFilter f in values){
            Predicate p = new Predicate(f.FilterByName);
            List subList = l.FindAll(p);
            results.Concat(subList);
        }
        return results;
    }
}

编辑:

好的,我的混合坚果版:)怎么样:):

public enum ItemTypes{
    Balloon,
    Cupcake,
    WaterMelon
    //Add the rest of the 26 items here...
}

public class ItemFilter {
    private ItemTypes Type { get; set; }
    public ItemFilter(ItemTypes type) {
        Type = type;
    }
    public bool FilterByType(ItemTypes type) {
        return this.Type == type;
    }
}

public class PicnicTable {
    private List Items;

    public PicnicTable() {
        Items = new List();
    }

    public void AddItem(ItemTypes item) {
        Items.Add(item);
    }

    public int HowMayItems(ItemTypes item)
    {
        ItemFilter filter = new ItemFilter(item);
        Predicate p = new Predicate(filter.FilterByType);
        List result = Items.FindAll(p);
        return result.Count;
    }
}

public class ItemsTest {
    public static void main(string[] args) {
        PicnicTable table = new PicnicTable();
        table.AddItem(ItemTypes.Balloon);
        table.AddItem(ItemTypes.Cupcake);
        table.AddItem(ItemTypes.Balloon);
        table.AddItem(ItemTypes.WaterMelon);
        Console.Out.WriteLine("How Many Cupcakes?: {0}", table.HowMayItems(ItemTypes.Cupcake));
    }
}


Jon Skeet.. 10

params数组是明显的答案.另一种方法是创建一个表示标准的类.然后,您可以使用集合初始值设定项,例如:

bool result = myCollection.Contains(new Criteria {
                 { 2, Item.Balloon },
                 { 4, Item.Cupcake }
              });

但如果这也没用,我们肯定需要更多信息.

如果你能提供一个例子,你想语法调用该方法,肯定会帮助我们.



1> Otávio Décio..:

使用参数:

PARAMS关键字可以指定一个方法参数,它接受一个说法,其中参数的数目是可变的.

在方法声明中的params关键字之后不允许使用其他参数,并且在方法声明中只允许一个params关键字...


调用者不会显式创建数组,但我认为这个调用仍然是*使用*数组是公平的.

2> Igor Zelaya..:

使用params关键字传递可变数量的参数:

   private static void HowMayItems(params T[] values) {
        foreach (T val in values) { 
            //Query how many items here..
        }
    }

你也可以创建一个谓词并传递一个参数过滤器.在该方法中,您可以返回所有结果的并集.像这样的东西:

public class Item { 
    public string Name { get; set; }
}
public class ItemFilter {
    public string Name { get; set; }
    public ItemFilter(string name) {
        Name = name;
    }
    public bool FilterByName(Item i) {
        return i.Name.Equals(Name);
    }
}

public class ItemsTest {
    private static List HowMayItems(List l,params ItemFilter[] values)
    {
        List results= new List();
        foreach(ItemFilter f in values){
            Predicate p = new Predicate(f.FilterByName);
            List subList = l.FindAll(p);
            results.Concat(subList);
        }
        return results;
    }
}

编辑:

好的,我的混合坚果版:)怎么样:):

public enum ItemTypes{
    Balloon,
    Cupcake,
    WaterMelon
    //Add the rest of the 26 items here...
}

public class ItemFilter {
    private ItemTypes Type { get; set; }
    public ItemFilter(ItemTypes type) {
        Type = type;
    }
    public bool FilterByType(ItemTypes type) {
        return this.Type == type;
    }
}

public class PicnicTable {
    private List Items;

    public PicnicTable() {
        Items = new List();
    }

    public void AddItem(ItemTypes item) {
        Items.Add(item);
    }

    public int HowMayItems(ItemTypes item)
    {
        ItemFilter filter = new ItemFilter(item);
        Predicate p = new Predicate(filter.FilterByType);
        List result = Items.FindAll(p);
        return result.Count;
    }
}

public class ItemsTest {
    public static void main(string[] args) {
        PicnicTable table = new PicnicTable();
        table.AddItem(ItemTypes.Balloon);
        table.AddItem(ItemTypes.Cupcake);
        table.AddItem(ItemTypes.Balloon);
        table.AddItem(ItemTypes.WaterMelon);
        Console.Out.WriteLine("How Many Cupcakes?: {0}", table.HowMayItems(ItemTypes.Cupcake));
    }
}



3> Jon Skeet..:

params数组是明显的答案.另一种方法是创建一个表示标准的类.然后,您可以使用集合初始值设定项,例如:

bool result = myCollection.Contains(new Criteria {
                 { 2, Item.Balloon },
                 { 4, Item.Cupcake }
              });

但如果这也没用,我们肯定需要更多信息.

如果你能提供一个例子,你想语法调用该方法,肯定会帮助我们.

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有