我正在运行C#framework 2.0,我想从列表中获取一些数据?该列表是List<>。如果没有循环并在List<>的每个元素上手动进行比较,我怎么能这样做呢?
答案 0 :(得分:8)
如果我正确地按照您的问题,您只需调用Find()
或FindAll()
方法即可从列表中获取数据项。例如:
List<string> myList = ..;
List<string> startingWithA = myList.FindAll(delegate(string s) { return s.StartsWith("A"); });
答案 1 :(得分:4)
您可以尝试谓词。这是我写的一个代码来说明这一点。当然,正如您在本示例中所看到的,您可以将谓词移到调用类之外并对其进行控制。如果您需要更多选项,这将非常有用。在谓词中,您可以与对象的所有属性/函数进行许多比较。
static void Main()
{
List<SimpleObject> list = new List<SimpleObject>();
list.Add(new SimpleObject(1,"Jon"));
list.Add(new SimpleObject( 2, "Mr Skeet" ));
list.Add(new SimpleObject( 3,"Miss Skeet" ));
Predicate<SimpleObject> yourFilterCriteria = delegate(SimpleObject simpleObject)
{
return simpleObject.Name.Contains("Skeet");
};
list = list.FindAll(yourFilterCriteria);//Get only name that has Skeet : Here is the magic
foreach (SimpleObject o in list)
{
Console.WriteLine(o);
}
Console.Read();
}
public class SimpleObject
{
public int Id;
public string Name;
public SimpleObject(int id, string name)
{
this.Id=id;
this.Name=name;
}
public override string ToString()
{
return string.Format("{0} : {1}",Id, Name);
}
}
答案 2 :(得分:2)
如果没有LINQ,您的主要选择是对列表的每个元素进行循环和比较。有几种方法可以帮助你。
List<T>.FindAll()
会获得Predicate
个委托,并会返回符合条件的所有项目。 List<T>.CopyTo()
和List<T>.GetRange()
可让您提取一系列元素。除此之外,你真的不能在LINQ之外的特定选择方面做很多事情。
答案 3 :(得分:1)
事实是,即使你最终通过Find或FindAll使用Predicates,它所做的一切都是在列表中循环,然后运行你的Predicate来测试匹配。性能方面你没有获得任何东西,但它肯定会产生更整洁的代码。
答案 4 :(得分:0)
不幸的是,List数据结构需要迭代来查找数据(请注意,上面的FindAll方法将在您的集合中迭代您的集合 - 以防您不惜一切代价避免这种情况),除非您知道该数据的索引然后你可以这样做:
List<String> list = new List<String>();
list.Add("andrew");
list.Add("nicole");
String value = list[1]; // returns "nicole"
答案 5 :(得分:0)
我认为上面的大多数答案都只是提供了另外一种方法来完成你想要避免的事情。根据数据结构,无论您选择何种实现,您/它都必须比较每个项目并选择匹配的项目。
根据您的匹配条件,SortedList可以帮助您避免搜索每个查询的整个列表。如果您的列表包含您创建的对象,则覆盖GetHashCode和Equals将帮助您。
如果匹配条件相当复杂,您可能需要完全不同的数据结构,例如字符串的trie。