C#阵列复制,调整大小

我有一个数组:C#阵列复制,调整大小

static Array results = new[] { new { Id, RoomCount, Cover, Space, Floor, 

FloorCount, NameHouse, Price, NameStreet } };

然后我有第二个:

var res = (//.......// 

select new { f.Id, f.RoomCount, f.Cover, f.Space, f.Floor, f.FloorCount,

h.NameHouse, f.Price, s.NameStreet }).ToArray();

然后我想复制RES到的结果:

var lres = res.Length; 

res.CopyTo(results, lres);

的水库的长度各不相同,结果的长度是固定的,因为它只是宣布。

我得到了一个exeption:dest数组的长度太短。 我也试图调整DEST数组:

var lres = res.Length; 

Array.Resize(results, lres);

也应声:用于方法System.Array.Resize<T>(ref T[], int)类型参数不能从使用推断。尝试明确指定类型参数。

有什么建议吗?

public partial class Search : System.Web.UI.Page 

{

public static int Id { get; set; }

public static int RoomCount { get; set; }

public static string Cover { get; set; }

public static int Space { get; set; }

public static int Floor { get; set; }

public static int FloorCount { get; set; }

public static string NameHouse { get; set; }

public static decimal Price { get; set; }

public static string NameStreet { get; set; }

static Array results = new[] { new { Id, RoomCount, Cover, Space, Floor, FloorCount, NameHouse, Price, NameStreet } };

private Array FormData()

{

//some code

var lng = ht.Length;

while (lng != 0)

{

//

var var = ht[lng - 1];

lng--;

var res = (from f in db.FlatSet

.Where(x => x.RoomCount >= rMin && x.RoomCount <= rMax)

.Where(x => x.Space >= sMin && x.Space <= sMax)

.Where(x => x.Floor >= fMin && x.Floor <= fMax)

.Where(x => x.FloorCount >= fcMin && x.FloorCount <= fcMax)

.Where(x => x.HouseTypeId == var)// || x.HouseTypeId == 2)

.Where(x => x.Price >= pMin && x.Price <= pMax)

.Where(x => x.Rent == r)

join h in db.HouseTypeSet on f.HouseTypeId equals h.Id

join s in db.StreetSet on f.StreetId equals s.Id

select new { f.Id, f.RoomCount, f.Cover, f.Space, f.Floor, f.FloorCount, h.NameHouse, f.Price, s.NameStreet }).ToArray();

var lres = res.Length;

Array.Resize(ref results, lres);

res.CopyTo(results, lres);

}

return results;

}

FIXED:

public class result

{

public int Id { get; set; }

public int RoomCount { get; set; }

public string Cover { get; set; }

public int Space { get; set; }

public int Floor { get; set; }

public int FloorCount { get; set; }

public string NameHouse { get; set; }

public decimal Price { get; set; }

public string NameStreet { get; set; }

}

public partial class Search : System.Web.UI.Page

{

DB_9AB8FB_lisogorEntities db = new DB_9AB8FB_lisogorEntities();

List<result[]> myList = new List<result[]>();

List<result> NewMyList = new List<result>();

}

//////some code

private List<result[]> FormData()//

{

int[] ht = (int[])arr;

var lng = ht.Length;

while (lng != 0)

{

//some code

var var = ht[lng - 1];

lng--;

myList.Add((from f in db.FlatSet

.Where(x => x.RoomCount >= rMin && x.RoomCount <= rMax)

.Where(x => x.Space >= sMin && x.Space <= sMax)

.Where(x => x.Floor >= fMin && x.Floor <= fMax)

.Where(x => x.FloorCount >= fcMin && x.FloorCount <= fcMax)

.Where(x => x.HouseTypeId == var)// || x.HouseTypeId == 2)

.Where(x => x.Price >= pMin && x.Price <= pMax)

.Where(x => x.Rent == r)

join h in db.HouseTypeSet on f.HouseTypeId equals h.Id

join s in db.StreetSet on f.StreetId equals s.Id

select new result{ Id = f.Id, RoomCount = f.RoomCount, Cover = f.Cover, Space = f.Space, Floor = f.Floor,

FloorCount = f.FloorCount, NameHouse = h.NameHouse, Price = f.Price, NameStreet=s.NameStreet }).ToArray());

}

return myList;

}

private void BindData()

{

var i = myList.Count;

while (i != 0)

{

if (myList[i - 1].Length != 0)

{

var j = myList[i - 1].Length;

while (j != 0)

{

NewMyList.Add(myList[i - 1][j-1]);

j--;

}

}

i--;

}

Results1.DataSource = NewMyList;

Results1.DataBind();

}

}

回答:

您使用匿名类型和cocmpiler不承认它是如何推断出两个数组的工会,因为编译器应该知道对象要创建实例的类型 你得到这个例外在

Array.Resize<T> 

方法,它应该是强类型
只是为了了解更多

class Program 

{

static void Main(string[] args)

{

Array results = new[] { new { RoomCount = "2", Cover = "5", Space = "5", Floor = "5", FloorCount = "5", NameHouse = "5", Price = "5", NameStreet = "5" } };

//with this line not cpmmented does not compile

Array.Resize(ref results, results.Length + 5);

String[] myArr = {"The", "quick", "brown", "fox", "jumps",

"over", "the", "lazy", "dog"};

Array.Resize(ref myArr, myArr.Length + 5);

MyTest[] resultsMyTest = new MyTest[] {new MyTest{RoomCount=3,Cover="Red"}};

//here it will work as the compiler know how to infer it

Array.Resize(ref resultsMyTest, results.Length + 5);

}

public class MyTest

{

public int RoomCount

{

get;

set;

}

public string Cover

{

get;

set;

}

}

}

希望这有助于

回答:

则尝试将显式类型在Array.Resize<T>

Array.Resize<String>(ref results, lres); 

然后换lres0因为lres是数组和CopyTo第二个参数的长度是开始索引目的地不是阵列的长度:

res.CopyTo(results, 0); 

索引是起始索引,您从最后一个索引开始,这就是为什么目标数组不够长。

或者使用Array.Copy()

Array.Copy(res, results, res.length); 

回答:

如果你对你的当前代码的解决方案后,因为它是走这一点,

var arguments=new object[] { results, results.Length + res.Length }; 

var method= typeof(Array).GetMethod("Resize").MakeGenericMethod(res.GetType().GetElementType());

method.Invoke(null,arguments);

var lastIndex = results.Length;

results = arguments[0] as Array;

res.CopyTo(results, lastIndex);

但我强烈建议你不要这样做。但创建一个class与所有这些属性和使用一个干净和可维护的代码List<YourClass>。匿名类的通用Array在您被迫执行完整的重新分解之前不会花费很长时间。

以上是 C#阵列复制,调整大小 的全部内容, 来源链接: utcz.com/qa/264232.html

回到顶部