C# LINQ将一个项目追加到数组末尾

8
我是一名有用的助手,可以为您翻译文本。

我有一个int[]数组。我需要将一个int添加到数组末尾,而不影响该数组中其他项的位置。使用C# 4和LINQ,最优雅的方法是什么?

我的代码:

 int[] items = activeList.Split(',').Select(n => Convert.ToInt32(n)).ToArray();
 int itemToAdd = ddlDisabledTypes.SelectedValue.ToInt(0);

 // Need final list as a string
 string finalList = X

感谢任何帮助!


2
为什么不直接执行 finalList = activeList.Append("," + ddlDisabledTypes.SelectedValue) 呢? - Steve B
items.Add(itemToAdd); 不起作用:'System.Array' 不包含名为 'Add' 的定义,并且没有接受类型为 'System.Array' 的第一个参数的扩展方法 'Add' 可以找到(是否缺少 using 指令或程序集引用?) - Jared
1
@Steve 的意思是,当输入和输出都是字符串时,为什么要将字符串转换为数组呢? - George Duckett
7个回答

23

尝试使用 items.Concat(new[] { itemToAdd });


9

最简单的方法是稍微改变您的表达方式。首先将其转换为List<int>,然后添加元素,最后再转换为数组。

List<int> items = activeList.Split(',').Select(n => Convert.ToInt32(n)).ToList();
int itemToAdd = ddlDisabledTypes.SelectedValue.ToInt(0);
items.Add(itemToAdd);

// If you want to see it as an actual array you can still use ToArray
int[] itemsAsArray = items.ToArray();

根据你最后一行的意思,似乎你想要将所有信息作为字符串值返回。如果是这样,你可以按照以下步骤操作:

var builder = new StringBuilder();
foreach (var item in items) {
  if (builder.Length != 0) {
    builder.Append(",");
  }
  builder.Append(item);
}
string finalList = builder.ToString();

如果总体目标只是将一个项目附加到字符串的末尾,那么直接执行此操作比将其转换为int集合,然后再转换回字符串更有效率。
int itemToAdd = ddlDisabledTypes.SelectedValue.ToInt(0);
string finalList = String.IsNullOrEmpty(activeList)
  ? itemToAdd.ToString()
  : String.Format("{0},{1}", activeList, itemToAdd);

最后一项是最好的例子。非常感谢您的帮助! - Jared

3
你的示例代码似乎很复杂,以匹配这些条件。
使用你的代码。
List<int> items = activeList.Split(',').Select(n => Convert.ToInt32(n)).ToList();  
items.Add(ddlDisabledTypes.SelectedValue.ToInt(0));  

string finalList = String.Join(',',items.ToArray());

仅操作字符串

int itemToAdd = ddlDisabledTypes.SelectedValue.ToInt(0);  
string finalList = String.IsNullOrWhiteSpace(activeList) ? 
                                           itemToAdd.ToString() :
                                           itemToAdd + string.format(",{0}",itemToAdd);

1

为什么不直接将该项添加为字符串

string finalList = items + "," + itemToAdd;

int 在连接操作中会自动转换为 string

如果 items 可能为 null 或空,则将表达式更改为

string finalList = String.IsNullOrEmpty(items) ? 
                     itemToAdd.ToString() : items + "," + itemToAdd;

1
如果items为空会发生什么? - Bob Vale
我不知道OP的逻辑细节。当然,如果项目可以为空,他必须检查这种情况。 - Olivier Jacot-Descombes

1
为什么不这样做:
 List<int> items = activeList.Split(',').Select(n => Convert.ToInt32(n)).ToList();
 int itemToAdd = ddlDisabledTypes.SelectedValue.ToInt(0);
 items.Add(itemToAdd);

编辑:

接下来,如果您想要一个整数数组:

int[] array = items.ToArray();

0
我不明白为什么要将字符串转换为数组再转换为字符串? 这是你需要的吗?
string finalList = activeList + "," + ddlDisabledTypes.SelectedValue;

0

我使用“union”创建一个新数组,在这种情况下,新元素位于开头:

class HelperX {
    /// <summary>
    /// Tenemos varios campos tipo bandera, cuyo valor puede ser 'S' = Sí o 'N' = No
    /// </summary>
    static public KeyValuePair<string, string>[] SiNo
    {
        get
        {
            return new KeyValuePair<string, string>[]
            {
                new KeyValuePair<string, string>( "S", "Sí"),
                new KeyValuePair<string, string>( "N", "No")
            };
        }
    }

    /// <summary>
    /// Tenemos varios campos tipo bandera, cuyo valor puede ser 'T' = 'Todos', 'S' = Sí o 'N' = No
    /// </summary>
    static public KeyValuePair<string, string>[] SiNoTodos
    {
        get
        {
            var todos = new KeyValuePair<string, string>[]
            {
                new KeyValuePair<string, string>( "T", "Todos"),
            }.Union(SiNo);

            return todos.ToArray();
        }
    }
}

此外,我可以创建一个selectListItem,在视图中将它们显示为选择选项:
ViewBag.SeleccionSiNoTodos = HelperX.SiNoTodos
  .Select(kv => new SelectListItem() { 
          Value = kv.Key, 
          Text = kv.Value, 
          Selected = seleccionados?.Contains(kv.Key) == true })
  .ToList();

最后,在视图中,我可以通过使用以下方式获取选择选项列表:

@Html.DropDownList("SeleccionSiNoTodos", (IEnumerable<SelectListItem>)ViewBag.SeleccionSiNoTodos)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接