我正在寻找一个更好的模式来处理每个需要处理的元素列表,然后根据结果从列表中删除.
你不能.Remove(element)
在里面使用foreach (var element in X)
(因为它导致Collection was modified; enumeration operation may not execute.
异常)...你也不能使用for (int i = 0; i < elements.Count(); i++)
,.RemoveAt(i)
因为它会扰乱你在集合中的当前位置i
.
有一种优雅的方式来做到这一点?
我知道IEnumerable.ToList()应该创建一个新的List,但是项目指向IEnumerable中的相同原始项,如ToList()所述 - 它是否创建一个新列表?
但是,我使用VS 2012的代码得到了一些奇怪的行为; WPF; 和.NET 4.0.它开始于IEnumerable.SequenceEquals()似乎没有像我预期的那样工作.我在我的QuickWatch对话框中挖掘,令人难以置信的是,以下语句的计算结果为false:
this.Items.First () == this.Items.ToList ()[ 0 ]
Run Code Online (Sandbox Code Playgroud)
我甚至尝试过:
this.Items.ToList ().IndexOf(this.Items.First ())
Run Code Online (Sandbox Code Playgroud)
评价为-1.
Items
在WPF自定义控件上声明为属性,如下所示:
public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register (
"Items",
typeof ( IEnumerable<UserLayoutType> ),
typeof ( UserLayoutSelectorControl ),
new FrameworkPropertyMetadata ( null, FrameworkPropertyMetadataOptions.AffectsRender, UserLayoutSelectorControl.PropertyChanged ) );
public IEnumerable<UserLayoutType> Items
{
get
{
return ( IEnumerable<UserLayoutType> ) this.GetValue ( UserLayoutSelectorControl.ItemsProperty );
}
set
{
this.SetValue ( UserLayoutSelectorControl.ItemsProperty, value );
}
}
Run Code Online (Sandbox Code Playgroud)
UserLayoutType只是XSD工具生成的类,具有以下声明:
//
// This source code was auto-generated …
Run Code Online (Sandbox Code Playgroud) 鉴于以下代码:
public class Item
{
private int _id;
private int _order;
private string _name;
public int Id
{
get { return _id; }
set { _id = value; }
}
public int Order
{
get { return _order; }
set { _order = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public static IList<Item> InitList1()
{
var list = new List<Item>
{
new Item { Id = 1, Order …
Run Code Online (Sandbox Code Playgroud) =====更新时间2016年8月20日=====
最新版本的fastjson现在可以
Dictionary<string, ?>
正确处理类型,我的问题现在解决了.=============================
我正在使用fastjson来序列化来自Dapper的查询结果,DB中的表具有如下数据:
id | name | price
1 | x | 100
2 | y | 200
....
Run Code Online (Sandbox Code Playgroud)
当我
using Dapper;
using fastJSON;
// ....
JSON.Parameters.KVStyleStringDictionary = false;
// ....
result = JSON.toJSON(conn.Query("SELECT * FROM tableX"));
Run Code Online (Sandbox Code Playgroud)
我希望结果如下:
[{"id":1,"name":"x","price":100},{"id":2,"name":"y","price":200},...]
Run Code Online (Sandbox Code Playgroud)
但实际结果输出:
[[{"Key":"id","Value":1},{"Key":"name","Value":"x"},{"Key":"price","Value":100}],
[{"Key":"id","Value":2},{"Key":"name","Value":"y"},{"Key":"price","Value":200}]...]
Run Code Online (Sandbox Code Playgroud)
生成了许多看起来多余的键值对.
有没有办法得到正确的结果?
或者我应该切换到另一个JSON序列化程序?
==========更新==========
makubex88的答案表明我可以创建一个映射表的自定义类,并使用它conn.Query<myClass>
来获取正确的json,虽然它适用于这种情况,看起来我必须为DB中的每个表创建数百个类才能获得理想的json结果,对我来说确实很累人.(谢谢你:P)
任何替代解决方案将受到高度赞赏!
该ToReadOnlyCollection扩展方法与快捷语句直接返回输入,如果它已经ReadOnlyCollection的一个实例来实现.该ToList扩展方法未启用.
纯粹出于好奇,是否有一个特殊的原因,或者只是一些没有实施的事情.我可以看到为什么保证ToList
始终返回一个新实例可能是有用的,但id有兴趣知道是否有任何其他原因.
我正在ComboBox
动态创建一个数组,而DataSource
for all ComboBox
是一个包含一些整数的整数列表.但是当我在任何一个组合框中更改值X时,所有其他组合值都会重置为值X.
我遇到了一个(对我而言)奇怪的行为.这是代码:
var objects = from i in items
//some calculations
select something;
// other calculations
objects.ToList().ForEach(x => {
//some calculations
x.Property = "some text"
});
return objects;
Run Code Online (Sandbox Code Playgroud)
首先我生成一个IEnumerable
,它是对db的查询,我跳过了细节.然后我必须做其他计算,最后我迭代我的对象来设置另一个参数.运行此代码,一旦IEnumerable
返回对象,Property
就不会设置它们.
否则,如果我ToList()
按照后面的Linq表达式移动,Property
则设置为:
var objects = (from i in items
//some calculations
select something).ToList();
// other calculations
objects.ForEach(x => {
//some calculations
x.Property = "some text"
});
return objects;
Run Code Online (Sandbox Code Playgroud)
据我所知,对象没有复制,但被引用......对吗?显然代码背后会发生什么?有什么不同?
假设我们有一系列任务(称为"任务"),然后将其转换为列表(称为"temp"),方法是:
var temp = tasks.ToList();
Run Code Online (Sandbox Code Playgroud)
运行数组元素指向的任务会发生什么?我们是否分别运行两组任务(一组在'tasks'中,另一组在'temp'中)?或者他们指向相同的任务?
以下代码(摘自考试参考文献70-483)与我所说的(最后三行)相关:
Task<int>[] tasks = new Task<int>[3];
tasks[0] = Task.Run(() => { Thread.Sleep(2000); return 1; });
tasks[1] = Task.Run(() => { Thread.Sleep(1000); return 2; });
tasks[2] = Task.Run(() => { Thread.Sleep(3000); return 3; });
while (tasks.Length > 0) {
int i = Task.WaitAny(tasks);
Task<int> completedTask = tasks[i];
Console.WriteLine(completedTask.Result);
var temp = tasks.ToList();
temp.RemoveAt(i);
tasks = temp.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
更新:我知道最后三行的目的但不知道它为什么起作用.
我创建了一个类的列表对象,然后更新它的值,它的值不更新请帮助我这里是我的代码
public class LocationData
{
public int LocId { get; set; }
public string LocatinName { get; set; }
public int ControlCount { get; set; }
public Nullable<short> KeyType { get; set; }
public Nullable<short> Financial_Reporting { get; set; }
public Nullable<short> FraudRisk { get; set; }
public Nullable<short> FinancialControl { get; set; }
public Nullable<short> ELC { get; set; }
}
var locList = location.Select(a =>
new LocationData { LocatinName = a.Location, LocId = a.LocID });
Run Code Online (Sandbox Code Playgroud)
之后,我正在尝试更新此值:
locList.Where(a => …
Run Code Online (Sandbox Code Playgroud) 我想知道为什么我的templist.clear()
方法清除了我添加到ManhattanDistance
词典中的列表.
在这方面的任何帮助将不胜感激,这是我一直在努力的数据挖掘项目的一部分.我必须使用k最近邻法来估算缺失值.
public void CalculateManhattanDistance(Dictionary<int, List<string>> MissingList, Dictionary<int, List<string>> OtherList)
{
Dictionary<int,Array> MissingListNeighbours = new Dictionary<int,Array>();
Dictionary<int, List<int>> ManhattanDistanceList = new Dictionary<int,List<int>>();
List<int> tempList = new List<int>();
int total=0;
int k=0;
try
{
for (int i = 0; i < MissingList.Count(); i++)
{
for (int j = 0; j < OtherList.Count(); j++)
{
for (k = 0; k < MissingList[0].ToArray().Length; k++)
{
if (Convert.ToChar(MissingList[i][k].ToString()) == '?')
continue;
else
total += Math.Abs(Convert.ToInt32(MissingList[i][k].ToString()) - Convert.ToInt32(OtherList[j][k].ToString()));
}
tempList.Add(total);
total …
Run Code Online (Sandbox Code Playgroud)