C# 集合c中单个项目的速记#

C# 集合c中单个项目的速记#,c#,C#,我有很多代码采用以下模式 void Add(int foo) { $my question } void Add(List<int> bar) { //do stuff } void添加(int foo) { $我的问题 } 无效添加(列表栏) { //做事 } 我想知道(除了写一个扩展方法)是否有比写短的东西: Add(新列表(newint[]{foo})) 每次我想调用第二个方法时。希望能在.net库中找到我错过的珍宝。如果您使用的是C#3或更高版本,您可以使用: Add

我有很多代码采用以下模式

void Add(int foo)
{
 $my question
}

void Add(List<int> bar)
{
//do stuff
}
void添加(int foo)
{
$我的问题
}
无效添加(列表栏)
{
//做事
}
我想知道(除了写一个扩展方法)是否有比写短的东西:

Add(新列表(newint[]{foo}))

每次我想调用第二个方法时。希望能在.net库中找到我错过的珍宝。

如果您使用的是C#3或更高版本,您可以使用:

Add(新列表{foo});
这相当于:

List<int> tmp = new List<int>();
tmp.Add(foo);
Add(tmp);
List tmp=newlist();
tmp.Add(foo);
添加(tmp);

我不确定它是否足够短,但这样也可以:

Add(new List<int> { foo });
Add(新列表{foo});

您可以直接在列表中使用集合初始值设定项:

Add(new List<int> { foo }); 
Add(新列表{foo});

您需要重构类似以下内容的代码:

void Add(int bar)
{
    //Code for single element
}
void Add(List<int> foo)
{
    foreach(int i in foo)
    {
        Add(i);
    }
}
void添加(整型条)
{
//单元素代码
}
无效添加(列表foo)
{
foreach(foo中的int i)
{
加(i);
}
}

如果您可以修改第二种方法,那么如果可以修改的话,可能会更好

void Add(params int[] bar)
{
}
然后可以像
Add(foo,foo2,foo3)
Add(myList.ToArray())


看看。

我倾向于使用
IEnumerable
作为序列参数,并使用
new[]
语法传递隐式类型数组:

public void Add (IEnumerable<int> bar)
{
}

// accepts:
Add (new List<int> { 1, 2, 3 });
Add (Enumerable.Range (1, 10));
Add (new [] { 1 });
public void Add(IEnumerable条)
{
}
//接受:
添加(新列表{1,2,3});
添加(可枚举范围(1,10));
添加(新[]{1});
作为一种变体,您可能需要定义一种“放大”扩展方法:

public IEnumerable<T> Amplify (T item)
{
    yield return item;
}

Add (1.Amplify ())
公共IEnumerable放大(T项)
{
收益回报项目;
}
添加(1.Amplify())

情况并非总是如此。有时候你想过滤元素,在它们上面聚集,不管怎样。如果需要这样的功能,LINQ比
if
guard更适合。
public IEnumerable<T> Amplify (T item)
{
    yield return item;
}

Add (1.Amplify ())