我是比较时机与寻找true一个值List<bool>使用List.Contains()与那些手卷循环.
我看到其他人报道的结果不同.我已经在几个系统上尝试过它,在我尝试过的所有系统上,循环看起来要快2到3.5倍.这些系统的范围从运行XP.4的笔记本电脑到运行Windows 8和.Net 4.5的最新PC.
其他人报告的结果不同,即List.Contains()与循环速度大致相同或略快于循环.
这是我的测试代码.
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace ConsoleApplication1
{
internal class Program
{
private static void Main()
{
int size = 10000000;
int count = 10;
List<bool> data = new List<bool>(size);
for (int i = 0; i < size; ++i)
data.Add(false);
var sw = new Stopwatch();
for (int trial = 0; trial < 5; ++trial)
{
sw.Restart();
for (int i = 0; i …Run Code Online (Sandbox Code Playgroud) 我有一个通用列表,正在被调用4次的方法中使用.此方法使用此通用列表的值在PDF中写入表.
我的问题是我需要在方法中反转这个通用列表,但我调用方法4次,所以每次调用方法时列表都被反转,我不想要...我该怎么做?有没有办法扭转列表而不改变原始?
这是在方法内:
t.List.Reverse();
foreach (string t1 in t.List)
{
//Some code
}
Run Code Online (Sandbox Code Playgroud) 我正在查看System.Collections.Generic.List <T>的开源代码.该AddRange(IEnumerable<T>)方法如下所示:
public void AddRange(IEnumerable<T> collection) {
Contract.Ensures(Count >= Contract.OldValue(Count));
InsertRange(_size, collection);
}
Run Code Online (Sandbox Code Playgroud)
这些InsertRange(int, IEnumerable<T>)方法看起来像这样:
public void InsertRange(int index, IEnumerable<T> collection) {
if (collection==null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.collection);
}
if ((uint)index > (uint)_size) {
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.index, ExceptionResource.ArgumentOutOfRange_Index);
}
Contract.EndContractBlock();
ICollection<T> c = collection as ICollection<T>;
if( c != null ) {
int count = c.Count;
if (count > 0) {
EnsureCapacity(_size + count);
if (index < _size) {
Array.Copy(_items, index, _items, index + count, _size - index); …Run Code Online (Sandbox Code Playgroud) 我有一个包含两个不同类型泛型列表,例如着想,让他们打电话Products和Employees.我正在尝试找到与员工位于同一位置的产品,即在哪里product.SiteId == emp.SiteId
List<Product> lstProds;
List<Employees> lstEmps;
Run Code Online (Sandbox Code Playgroud)
我的(老skool)大脑告诉我使用forEach循环找到匹配但我怀疑有一个('更好'/更快/更快?)的方式来使用Linq.任何人都可以照亮我吗?我在网上找到的所有例子都涉及原语列表(字符串/整数),并没有特别有用.
在C#中,我一直在通用列表中执行FindAll,如下所示:
List<group.category> tlist = list.FindAll(p => p.parid == titem.catid);
Run Code Online (Sandbox Code Playgroud)
两个问题,这是执行这样的事情的适当方式,我如何将其转换为VB.Net
出于好奇,通用List <>实现非通用接口IList的原因是什么?
示例代码
IList<int> list = new List<int>();
list.Add(1);
//compiles but ArgumentException thrown at run time
((IList)list).Add(new object());
Run Code Online (Sandbox Code Playgroud) 这里也提出了类似的问题,但没有一个符合我的需要.
我做了测试用例,看看哪个更快.但我觉得我的linq代码仍然很慢.如何构建linq代码以获得更快的性能?
其他人说使用double .Tolist()会导致操作变慢,当我测试它时,它表明它比任何其他测试都快.
测试:
Preparation
---------------------------------------------------------------
return Properties of UserInfo(userinf, true){
UserID = userinf.UserID;
FirstName = userinf.user.FirstName;
MiddleName = userinf.user.MiddleName;
LastName = userinf.user.LastName;
LoginID = userinf.user.LoginID;
Birthday = userinf.Birthday;
}
skip = 0;
take = 100;
total table records = 304;
Linq to Entity Framework
Run Code Online (Sandbox Code Playgroud)
提琴手:v2.4.0.0
https://127.0.0.1/..../RetrieveUserInfo?skip=0&take=100
{
"client":{
"SessionID":"5433ab64-7e0d-444f-b886-a901ea9a0601"
},
"session":{
"SessionID":"35b75daa-25ad-45a4-9f99-0e69ec3b66a4"
}
}
Run Code Online (Sandbox Code Playgroud)
//Test 1
//1) 00:00:15.3068755 -- Attempt1
//2) 00:00:13.8207905 -- Attempt2
//3) 00:00:16.2489294 -- Attempt3
var list = (from usr in dbase.userinfoes
select usr).OrderBy(i …Run Code Online (Sandbox Code Playgroud) 我正在尝试列出游戏中的所有项目,using System.Text.Json;
我对使用 .json 文件非常陌生,我尝试这样做来测试它是否有效:
List<Item> AllItems = new List<Item>();
string json = File.ReadAllText("Items.json");
AllItems = Deserialize<List<Item>>(json);
WriteLine(AllItems[0].Name);
Run Code Online (Sandbox Code Playgroud)
它不允许我将其转换为列表这是 json 文件
{
"Item": [
{
"Weapon": [
{
"CritChance": 60,
"HitChance": 80,
"OGDamge": 15,
"Damage": 15,
"Damage_Type": "Physical",
"Weapon_Type": "Fist",
"Player": null,
"APUsage": 4,
"ID": 1,
"Name": "Debug",
"Value": 16,
"Rarity": "Common",
"Item_Type": "Weapon"
},
{
"CritChance": 40,
"HitChance": 70,
"OGDamge": 15,
"Damage": 15,
"Damage_Type": "Electric",
"Weapon_Type": "Bow",
"Player": null,
"APUsage": 5,
"ID": 2,
"Name": "Debug2",
"Value": 15,
"Rarity": …Run Code Online (Sandbox Code Playgroud) 我有一个List<Location>被调用的子类LocationList.这是我们添加其他属性的便捷方式(IsExpanded比如我们可以在UI中使用的那些.足够好.但是现在,我们希望每个位置都知道它的父级.因此,我们需要在某些事情时得到通知添加到LocationList,但你不能覆盖Add和Remove.虽然我们可以使用ObservableCollection,这更像是一个View/ViewModel构造.这是纯模型数据.
当然我们可以在将父项添加到集合时手动设置父项,但我讨厌这样的非自动化逻辑,因为没有什么可以正确地强制执行它的集合.让集合(好吧,List)自动说'嘿......你被添加了,所以我将你的父母设置为拥有我的班级."就是我所追求的.
我的想法是代替子类List<Location>而不是创建一个List<Location>内部使用的直接类,然后我可以简单地公开我自己的添加/删除方法并处理那里的'父'的调整.但是,这样做会导致内部集合无法枚举,因为它在内部.
也就是说,是否有任何方法可以监听更改List<Location>,或者至少将其IEnumerable包装对象的接口委托给其包装器?
我如何传递一个列表,该列表是一个DerivedObjects列表,其中Method期望一个BaseObjects列表.我正在转换列表.ToList<BaseClass>(),我想知道是否有更好的方法.我的第二个问题是语法不正确.我试图传递列表byref,我收到一个错误:'ref' argument is not classified as a variable
我该如何解决这两个问题?谢谢.
public class BaseClass { }
public class DerivedClass : BaseClass { }
class Program
{
static void Main(string[] args)
{
List<DerivedClass> myDerivedList = new List<DerivedClass>();
PassList(ref myDerivedList.ToList<BaseClass>());
// SYNTAX ERROR ABOVE IS - 'ref' argument is not classified as a variable
Console.WriteLine(myDerivedList.Count);
}
public static void PassList(ref List<BaseClass> myList)
{
myList.Add(new DerivedClass());
Console.WriteLine(myList.Count);
}
}
Run Code Online (Sandbox Code Playgroud)
解决了:
类似的方法解决了我的问题.
public static void PassList<T>(ref List<T> myList) where T : BaseClass
{ …Run Code Online (Sandbox Code Playgroud) c# ×10
generic-list ×10
.net ×2
linq ×2
findall ×1
generics ×1
ienumerable ×1
ilist ×1
json ×1
list ×1
optimization ×1
performance ×1
predicate ×1
ref ×1
reverse ×1
vb.net ×1