2013-11-23 83 views
0

我有一个数组: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(); 
    } 
    } 
+0

可能不是很好的代码,但'results = results.Union(res).ToArray()'可能有帮助。 –

+0

无法联合阵列 – user2970104

+0

添加:使用System.Linq;已添加 –

回答

0

您使用匿名类型和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; 
     } 

    } 


} 

希望这有助于

+0

如果两个数组的长度相等,则一切正常。这两个数组的类型都是相同的。 – user2970104

0

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

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

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

res.CopyTo(results, 0); 

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

或者使用Array.Copy()

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

不起作用,同样的错误 – user2970104

+0

@ user2970104指定'Array.Resize '中的数据类型?见上面的更新。 – Edper

+0

我有匿名类型数组,我可以使用? – user2970104

0

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

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在您被迫执行完整的重新分解之前不会花费很长时间。