C# 删除“&引用;数组列表中的元素

C# 删除“&引用;数组列表中的元素,c#,C#,我有一个arraylist: ArrayList ftd = new ArrayList(); ftd.Add(new string[]{ "foo1.txt", "01.01.2011" }); ftd.Add(new string[]{ "foo2.txt", "04.01.2011" }); ftd.Add(new string[]{ "foo3.txt", "09.01.2011" }); 经过一些逻辑之后,arraylist如下所示: [0] = { "foo1.txt", "01.

我有一个arraylist:

ArrayList ftd = new ArrayList();
ftd.Add(new string[]{ "foo1.txt", "01.01.2011" });
ftd.Add(new string[]{ "foo2.txt", "04.01.2011" });
ftd.Add(new string[]{ "foo3.txt", "09.01.2011" });
经过一些逻辑之后,arraylist如下所示:

[0] = { "foo1.txt", "01.01.2011" }
[1] = { "", "04.01.2011" }
[2] = { "foo3.txt", "09.01.2011" }
现在:如何通过ftd循环并删除元素?元素的第一个变量是“”?

尝试如下操作:

var filteredFtd = ftd.Cast<string[]>().Where(a => false == a[0].Equals(""));
var ftd = new List<string[]>();
ftd.Add(new string[]{ "foo1.txt", "01.01.2011" });
ftd.Add(new string[]{ "foo2.txt", "04.01.2011" });
ftd.Add(new string[]{ "foo3.txt", "09.01.2011" });

var filteredFtd = ftd.Where(a => false == a[0].Equals(""));
var filteredfdtd=ftd.Cast()。其中(a=>false==a[0]。等于(“”);
如果你不想改变ftd的位置

如果您确实想在适当的位置更改它,可以按照其他答案中的建议使用RemoveAll

顺便说一句:我将使用System.Collections.Generic中的a。类型安全性可以使您避免经常出现愚蠢的错误,还可以消除强制转换为神奇已知类型的要求(您必须记住正确的类型,否则会遇到运行时异常)。代码将类似于:

var filteredFtd = ftd.Cast<string[]>().Where(a => false == a[0].Equals(""));
var ftd = new List<string[]>();
ftd.Add(new string[]{ "foo1.txt", "01.01.2011" });
ftd.Add(new string[]{ "foo2.txt", "04.01.2011" });
ftd.Add(new string[]{ "foo3.txt", "09.01.2011" });

var filteredFtd = ftd.Where(a => false == a[0].Equals(""));
var ftd=new List();
添加(新字符串[]{“foo1.txt”,“01.01.2011”});
添加(新字符串[]{“foo2.txt”,“04.01.2011”});
添加(新字符串[]{“foo3.txt”,“09.01.2011”});
var filteredfdtd=ftd。其中(a=>false==a[0]。等于(“”);
尝试以下方法:

var filteredFtd = ftd.Cast<string[]>().Where(a => false == a[0].Equals(""));
var ftd = new List<string[]>();
ftd.Add(new string[]{ "foo1.txt", "01.01.2011" });
ftd.Add(new string[]{ "foo2.txt", "04.01.2011" });
ftd.Add(new string[]{ "foo3.txt", "09.01.2011" });

var filteredFtd = ftd.Where(a => false == a[0].Equals(""));
var filteredfdtd=ftd.Cast()。其中(a=>false==a[0]。等于(“”);
如果你不想改变ftd的位置

如果您确实想在适当的位置更改它,可以按照其他答案中的建议使用RemoveAll

顺便说一句:我将使用System.Collections.Generic中的a。类型安全性可以使您避免经常出现愚蠢的错误,还可以消除强制转换为神奇已知类型的要求(您必须记住正确的类型,否则会遇到运行时异常)。代码将类似于:

var filteredFtd = ftd.Cast<string[]>().Where(a => false == a[0].Equals(""));
var ftd = new List<string[]>();
ftd.Add(new string[]{ "foo1.txt", "01.01.2011" });
ftd.Add(new string[]{ "foo2.txt", "04.01.2011" });
ftd.Add(new string[]{ "foo3.txt", "09.01.2011" });

var filteredFtd = ftd.Where(a => false == a[0].Equals(""));
var ftd=new List();
添加(新字符串[]{“foo1.txt”,“01.01.2011”});
添加(新字符串[]{“foo2.txt”,“04.01.2011”});
添加(新字符串[]{“foo3.txt”,“09.01.2011”});
var filteredfdtd=ftd。其中(a=>false==a[0]。等于(“”);

如果您使用的是非LINQ方法,一个选项是循环使用该方法,并将所有其他元素复制到新列表中:

ArrayList ftd2 = new ArrayList();

foreach(object element in ftd)
{
    string [] str = (string[])element;
    if(str[0] != "")
        ftd2.add(str);
}

差不多吧。未经测试的代码,但您应该了解这一点。

如果您使用的是非LINQ方法,一个选项是循环使用它,并将所有其他元素复制到一个新列表中:

ArrayList ftd2 = new ArrayList();

foreach(object element in ftd)
{
    string [] str = (string[])element;
    if(str[0] != "")
        ftd2.add(str);
}

差不多吧。未经测试的代码,但您应该明白。这两个示例都将从列表中删除项目,而不复制列表

我还喜欢使用
string.IsNullOrEmpty
进行检查。它使您的代码更加清晰,并检查是否存在可能的
null

我的首选方法:如果您可以使用
列表
,您可以使用:

var ftd = new List<string[]>();
// Logic to fill & handle

// To remove
ftd.RemoveAll(a => string.IsNullOrEmpty(a[0]));
var ftd=new List();
//填充和处理的逻辑
//除去
ftd.RemoveAll(a=>string.IsNullOrEmpty(a[0]);
你会更安全一些

如果您无法更改类型。您可以使用计数器而不是迭代器(foreach)在列表中循环:

for(int i=0;i
这两个示例都将从列表中删除项目,而不复制列表

我还喜欢使用
string.IsNullOrEmpty
进行检查。它使您的代码更加清晰,并检查是否存在可能的
null

我的首选方法:如果您可以使用
列表
,您可以使用:

var ftd = new List<string[]>();
// Logic to fill & handle

// To remove
ftd.RemoveAll(a => string.IsNullOrEmpty(a[0]));
var ftd=new List();
//填充和处理的逻辑
//除去
ftd.RemoveAll(a=>string.IsNullOrEmpty(a[0]);
你会更安全一些

如果您无法更改类型。您可以使用计数器而不是迭代器(foreach)在列表中循环:

for(int i=0;i
尝试使用以下方法:

var result = ftd.Cast<string[]>().Where(x => x[0] != "");
var result=ftd.Cast()。其中(x=>x[0]!=”;
尝试使用以下方法:

var result = ftd.Cast<string[]>().Where(x => x[0] != "");
var result=ftd.Cast()。其中(x=>x[0]!=”;

您可以尝试使用LINQ修改列表:

var results = from string[] s in ftd
              where s[0] != ""
              select s;
ftd = new ArrayList(results.ToList());

您可以尝试使用LINQ修改列表:

var results = from string[] s in ftd
              where s[0] != ""
              select s;
ftd = new ArrayList(results.ToList());

我喜欢这样的东西

    static void Main(string[] args)
    {
        ArrayList ftd = new ArrayList();
        ftd.Add(new string[] { "foo1.txt", "01.01.2011" });
        ftd.Add(new string[] { "", "04.01.2011" });
        ftd.Add(new string[] { "foo3.txt", "09.01.2011" });

        var result = ftd.Cast<string[]>().Where(x => !string.IsNullOrWhiteSpace(x[0]));
    }
static void Main(字符串[]args)
{
ArrayList ftd=新的ArrayList();
添加(新字符串[]{“foo1.txt”,“01.01.2011”});
ftd.Add(新字符串[]{”,“04.01.2011”});
添加(新字符串[]{“foo3.txt”,“09.01.2011”});
var result=ftd.Cast()。其中(x=>!string.IsNullOrWhiteSpace(x[0]);
}

我喜欢这样的东西

    static void Main(string[] args)
    {
        ArrayList ftd = new ArrayList();
        ftd.Add(new string[] { "foo1.txt", "01.01.2011" });
        ftd.Add(new string[] { "", "04.01.2011" });
        ftd.Add(new string[] { "foo3.txt", "09.01.2011" });

        var result = ftd.Cast<string[]>().Where(x => !string.IsNullOrWhiteSpace(x[0]));
    }
static void Main(字符串[]args)
{
ArrayList ftd=新的ArrayList();
添加(新字符串[]{“foo1.txt”,“01.01.2011”});
ftd.Add(新字符串[]{”,“04.01.2011”});
添加(新字符串[]{“foo3.txt”,“09.01.2011”});
var result=ftd.Cast()。其中(x=>!string.IsNullOrWhiteSpace(x[0]);
}
试试看

ArrayList ftd=新的ArrayList()

试试看

ArrayList ftd=新的ArrayList()


如果您在arraylist中使用每个数组的长度变量,您可以比较长度,如果数组的长度等于1,则可以删除该值。请注意,将日期存储为字符串始终是一种不好的做法。如果您在arraylist中使用每个数组的长度变量,则会很有帮助,你可以比较长度,如果数组的长度等于1,你可以删除它。请注意,将日期存储为字符串总是不好的做法。只是好奇,为什么要使用
false==expr
而不是
!expr
?jb:读代码时很难漏掉!有些东西可能会在评论中漏掉,false==有些东西不太可能被忽略。只是好奇,你为什么用
false==expr
而不是
!expr
?jb:读代码时很难漏掉!某些内容可能会在评论中漏掉,false==某些内容不太可能被忽略。它不会从列表中删除元素,这会创建一个没有某些元素的列表副本。@GvS:Right-yo