我有项目列表,我检查列表中是否存在项目。如果它存在,我试图找到它。
我认为它有一点开销,因为我目前在列表上进行两次传递。是否有可能单次通过?
目前我有。
public partial class Item
{
public string text;
public int id;
}
....
static List<Item> data = new List<Item>();
static stub = new Item() { text = "NaN", id = -1 };
public static Item Get(int targetId)
{
if (data.Any(f => f.id == targetId) == false)
{
return stub;
}
return data.Find(f => f.id == targetId);
}
我想要像
这样的东西...
public static Item Get(int targetId)
{
Item result;
result = data.Find(f => f.id == targetId);
if (result == null)
{
return stub;
}
return result;
}
答案 0 :(得分:3)
您似乎在寻找FirstOrDefault()
:
Item _stub = new Item
{
text = "NaN",
id = -1
};
public Item FindByID(int id)
{
// Find the first item that has the provided id, or null if none exist.
var existingItem = data.FirstOrDefault(i => i.id == id);
// When not found, return the _stub
return existingItem ?? _stub;
}
您还可能需要重新考虑您的命名惯例,以及您是否确实需要这些成员static
。
答案 1 :(得分:2)
您可以使用List.FindIndex
:
public static Item get(int i)
{
int index = data.FindIndex(item => item.id == i);
if (index == -1) return stub;
return data[index];
}
如果它实际上是一个数组,您可以使用Array.FindIndex
:
public static Item get(int i)
{
int index = Array.FindIndex(data, item => item.id == i);
if (index == -1) return stub;
return data[index];
}
答案 2 :(得分:0)
所以FirstOrDefault()
是要走的路。如果该列表中只有一个项目,您也可以使用SingleOrDefault()
。
static stub = new Item() { text = "NaN", id = -1 };
public static Item get(int i)
{
Item result;
result = data.FirstOrDefault(f => f.id == i);
if (result == null)
{
return stub;
}
return result;
}
答案 3 :(得分:0)
我想你可以试试这个:
return data.Find(f => f.id == i) ?? stub;
答案 4 :(得分:0)
我正是为了这个目的而使用扩展方法
rake db:migrate:down VERSION=20151014152222
在你的情况下使用
public static T FirstOrSpecificDefault<T>(this IEnumerable<T> list,
Func<T, bool> predicate, T defaultValue)
{
return list.FirstOrDefault(predicate) ?? defaultValue;
}